[Zope-dev] thread restrictions?
Robin Becker
robin@jessikat.demon.co.uk
Fri, 23 Jul 1999 03:20:11 +0100
In article <dB5WjDAvs8l3EwOl@jessikat.demon.co.uk>, Robin Becker
<robin@jessikat.demon.co.uk> writes
I am a moron this orderedjobs thing is using a polling loop
>Are there any restrictions on using threads in ExternalMethods I am trying to
>figure
>out why my cpu usage goes to 100% after calling the function TGA_CALC below as
>an
>ExternalMethod. The OrderedJobs thingy is intended to arbitrate a first come
>first
>served policy for my cpu hog calculations which being memory intensive as well I
>want
>only one job ever to be initialised and running.
>
>#TZGA.py proxy for the real calculation
>from DateTime import DateTime
>from OrderedJobs import OrderedJobs
>from Queue import Full
>_Jobs=OrderedJobs()
>
>def _TGA_RUN():
> for i in xrange(1000):
> t=DateTime('GMT').rfc822()
> return t
>
>def TGA_CALC():
> global _Jobs
> try:
> return _Jobs.add(_TGA_RUN,args=(),kwargs={})
> except Full:
> raise "couldn't add job "
>##########################################
>
>##### the OrderedJobs module
>'''
>Module to implement ordered locking
>'''
>from thread import *
>from Queue import Queue, Full
>
>class _Item:
> def __init__(self,func=None,args=(),kwargs={}):
> self.args=args
> self.kwargs=kwargs
> self.func=func
> self.lock=allocate_lock()
>
>class OrderedJobs:
> def __init__(self,maxsize=5):
> self.Q=Queue(maxsize)
> self.serve=1
> self.T=start_new_thread(self.run,())
>
> def run(self):
> while self.serve:
> if not self.Q.empty():
> item=self.Q.get(0)
> if item.func:
> item.result=apply(item.func,
> item.args,item.kwargs)
> else:
> item.result=None
> item.lock.release()
>
> def add(self,func,args=(),kwargs={}):
> if self.Q.full(): raise Full
> item=_Item(func,args,kwargs)
> item.lock.acquire()
> self.Q.put(item)
> item.lock.acquire()
> item.lock.release()
> return item.result
>
>if __name__=='__main__':
> import time
> def testJob(n,delay):
> print 'starting testJob ',n, delay
> time.sleep(delay)
> print 'finished testJob ',n
> return None
> def addJob(i,delay):
> print 'adding job',i
> try:
> Q.add(testJob,(i,3.7))
> except Full:
> print "couldn't add job ",i
>
> Q=OrderedJobs()
> for i in range(1,18):
> start_new_thread(addJob,(i,3.7))
> time.sleep(0.7)
>###############################
--
Robin Becker