Python Query: Related to locking a resource in a multithreaded environment

Nils Oliver Kröger NO_Kroeger at gmx.de
Tue Aug 19 14:58:11 EDT 2008


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

I don't think the global interpreter lock is what you need ... read here
for reference:

http://docs.python.org/api/threads.html

My approach what be to write one class for reading and writing to the
configuration and make that class thread-safe using the RLock.

Then you create one and only one instance of this class and let all your
threads use (not import) that one instance.

You could achieve that "one and only one" either by having a main
program which creates the instance and pass the reference to each thread
via its __init__ or you implement the Configuration class as a singleton
like this:


class Singleton(object):
	"""
	A simple example implementing the singleton design pattern in
	python
	"""
	#we need two class attributes (which translate to static 	
		attributes in java)
	__lock = Lock() #a lock for thread safety
	__instance = None #and to remember the one instance

	#first of all: make pythons usual way of creating objects 	
	# unusable because we cannot just hide them as one would in java 	# or C++
	def __new__(cls, *args, **kwargs):
		pass

	def __init__(self):
		pass

	@classmethod
	def getInstance(cls, *args, **kwargs):
	"""
	The famous gatInstance method which resturns the one instance of 	our
	class.

	params:
	cls - reference to the class
	*args - the tuple of arguments paassed by position
	**kwargs - the dictionary of arguments passed by keyword
	"""
	#enter critical section
	cls.__lock.acquire()
	try:
		if cls.__instance is None:
			#use the superclasses __new__ for creation
			cls.__instance = object.__new__(cls, *args, 									**kwargs)

			#place initialisation code (everything which 					#would usually
happen in __init__) here
			cls.__instance.SomeInt = 1
	finally:
		#leave critical section
		cls.__lock.release()

	return cls.__instance


Add your methods for accessing as instance methods to this class and get
the same instance of this class in each thread by calling
Singleton.getInstance().

Hope that helps

Regards

Nils

tarun schrieb:
> I think I need something called global interpreter lock which is
> accessible to all the threads. But I am not sure how to implement this.
> 
>  
> On Tue, Aug 19, 2008 at 11:28 AM, tarun <tarundevnani at gmail.com
> <mailto:tarundevnani at gmail.com>> wrote:
> 
>     Hello All,
>      
>     I've a configuration.ini file. This particular can be accessed by
>     several threads of my application. Each thread can read/write
>     configuration parameters from/to the configuration.ini file. I am
>     using threading (Rlock) to lock the resource (configuration.ini
>     file) while accessing it from any thread. I use the file available
>     at http://www.voidspace.org.uk/python/configobj.html for read/write.
>      
>     I did the following in one of my files:
>      
>     import threading
>     class Synchronization:
>       def __init__(self):
>         self.mutex = threading.RLock()
>      
>     Now this I can create instances of the class Synchronization and use
>     acquire/release to work on the shared resource. But every thread
>     would need to import this class and hence each thread would create a
>     separate instance of the class. This means several lock variables.
>     But I think we need a global lock flag that is accessible across all
>     the threads.
>      
>     How do i do this?
>      
>     Please let me know ASAP.
>      
>     Thanks In Advance,
>     Tarun
> 
> 
> 
> ------------------------------------------------------------------------
> 
> --
> http://mail.python.org/mailman/listinfo/python-list
-----BEGIN PGP SIGNATURE-----

iD8DBQFIqxfCzvGJy8WEGTcRApe+AJ9MNqWI9FOsJIKuTKxy8ZNSGYTy2gCdHtGc
clDPMMAPRoIxsBvVm4ygi6U=
=vIPW
-----END PGP SIGNATURE-----
-------------- next part --------------
A non-text attachment was scrubbed...
Name: NO_Kroeger.vcf
Type: text/x-vcard
Size: 162 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-list/attachments/20080819/3aedb8cf/attachment.vcf>


More information about the Python-list mailing list