here is another variant of the minimal product:: from time import sleep, clock, time from threading import * from OFS import SimpleItem lock = Lock() condition = Condition() class minimal(SimpleItem.SimpleItem, Thread): "minimal object" meta_type = 'minimal' manage_options = ( {'label': 'View', 'action': 'index_html'}, ) def __init__(self, id): "initialise a new instance of Minimal" self.id = id def index_html(self): "used to view content of the object" time1 = time() lock.acquire() time2 = time() sleep(2) time3 = time() lock.release() time4 = time() return '%s\t%s\t%s\t%s'%(time1,time2,time3,time4) def manage_addMinimal(self, id, RESPONSE=None): "Add a Minimal to a folder." self._setObject(id, minimal(id)) RESPONSE.redirect('index_html') def manage_addMinimalForm(self): "The form used to get the instance' id from the user." return """<html> <body> Please type the id of the minimal instance:<br> <form name="form" action="manage_addMinimal"><br> <input type="text" name="id"><br> <input type="submit" value="add"> </form> </body> </html>""" The test below makes it seem that when hit with a batch of requests, the first 4 request get the 4 worker threads, with 3 waiting on the lock, but when the 1st thread releases the lock, it starts processing another request and reacquires the lock before the other three threads manage to wake up. So the other 3 threads are starved and the first thread processes the bulk of the requests. I hit Zope from a client with:: for i in range(20): Thread(target = retrieve).start() and get back:: 200 1026117262.34 1026117262.34 1026117264.33 1026117264.33 200 1026117264.34 1026117264.34 1026117266.33 1026117266.33 200 1026117266.34 1026117266.34 1026117268.33 1026117268.33 200 1026117268.34 1026117268.34 1026117270.33 1026117270.33 200 1026117270.34 1026117270.34 1026117272.33 1026117272.33 200 1026117272.34 1026117272.34 1026117274.33 1026117274.33 200 1026117274.34 1026117274.34 1026117276.33 1026117276.33 200 1026117276.34 1026117276.34 1026117278.33 1026117278.33 200 1026117278.34 1026117278.34 1026117280.33 1026117280.33 200 1026117280.34 1026117280.34 1026117282.33 1026117282.33 200 1026117282.34 1026117282.34 1026117284.33 1026117284.33 200 1026117284.34 1026117284.34 1026117286.33 1026117286.33 200 1026117286.34 1026117286.34 1026117288.33 1026117288.33 200 1026117288.34 1026117288.34 1026117290.33 1026117290.33 200 1026117290.34 1026117290.34 1026117292.33 1026117292.33 200 1026117292.34 1026117292.34 1026117294.33 1026117294.33 200 1026117294.34 1026117294.34 1026117296.33 1026117296.33 200 1026117262.35 1026117296.35 1026117298.34 1026117298.34 200 1026117262.35 1026117298.35 1026117300.35 1026117300.35 200 1026117262.34 1026117300.36 1026117302.36 1026117302.36 I can reproduce this beahviour reliably. I am using Zope-2.5.1, with python-2.1.3 under linux. Daniel
Daniel Mahler writes:
.... The test below makes it seem that when hit with a batch of requests, the first 4 request get the 4 worker threads, with 3 waiting on the lock, but when the 1st thread releases the lock, it starts processing another request and reacquires the lock before the other three threads manage to wake up. So the other 3 threads are starved and the first thread processes the bulk of the requests. You may try a 10 ms sleep after releasing the lock.
Not sure that is will work... Dieter
participants (2)
-
Daniel Mahler -
Dieter Maurer