[Twisted-Python] 2 questions: adbapi.ConnectionPool ; Defer.DeferredSemaphore , threads.deferToThread

Jonathan Vanasco twisted-python at 2xlp.com
Thu Sep 14 23:06:37 MDT 2006


>> a-
>>     can someone clarify adbapi.ConnectionPool for me?
>>     i'm specifically wondering if connect/disconnect returns a  
>> handle to the pool and it the pool blocks until a handle is  
>> ready.  i think it probably doesn't work that way.  but i feel the  
>> need to check.


>> I can only answer your first question. Connect/disconnect are  
>> blocking
> functions and are generally only called from the connection pool  
> itself.
>
> User code generally only needs to call runInteraction, runQuery, or
> runOperation, and the pool will make connections as needed.

hm... i'll have to play with this.  i'm trying to fork some already  
written scripts that block as threads... grabbing a lock on a db from  
the pool, then returning it when done.

i answered part b for me.

i don't know if this example below would be of use to anyone, and its  
definitely poorly written.
but it is both functional and example of running a bunch of blocking  
processes in a finite number of threads managed by DeferredSemaphore  
( i could only find docs/examples for infinite threads or non- 
threaded DeferredSemaphore )

------------------------------------------------------------------------ 
------------------

from twisted.application import internet
from twisted.internet import defer , reactor , threads

import time

CHECK_PERIOD= 5
SIMULTANEOUS= 2
HELP= 1

class ThreadedSemaphoreService(object):
	semaphore= defer.DeferredSemaphore( tokens= SIMULTANEOUS )

	def __init__(self):
		self.interval_action()

	def interval_action( self ):
		if HELP:
			print "interval_action()"
		
		# this would likely be a sql select
		action_queue= range(1,6)

		if len ( action_queue ):
			actions= []
			for action_item in action_queue:
				d= self.act_on( action_item )
				actions.append(d)
			finished= defer.DeferredList( actions )
			finished.addCallback( self.re_register__interval_action )
		else:
			self.re_register__interval_action()

	def re_register__interval_action( self , deferlist ):
		if HELP:
			print "re_register__interval_action()"
		reactor.callLater( CHECK_PERIOD , self.interval_action )
	
	def act_on( self , queue_item ):
		if HELP:
			print "in main - act_on()"
		t= threads.deferToThread( self._act_on )
		return t

	def _act_on( self ):
		if HELP:
			print "\t thread - _act_on()"
		d= self.semaphore.acquire()
		d.addCallback( self.sleeper )
		d.addCallback( self.awake )

	def sleeper( self , deferredSemaphore ):
		if HELP:
			print "\t thread - sleeper() - i want to sleep in my own thread  
tonight"
		time.sleep(2)
		return deferredSemaphore

	def awake( self , deferredSemaphore ):
		if HELP:
			print "\t thead - awake() - now awake"
		deferredSemaphore.release()

if __name__ == '__main__':
	myService= ThreadedSemaphoreService()
	reactor.run()




More information about the Twisted-Python mailing list