I am trying to figure out how Zope processes concurrent requests. I am running Zope using ZServer (without a webserver in front) My initial investigations suggest contradictory answers: * ZServer uses medusa, which uses asyncore which works by single threaded select multiplexing * z2.py has:: # The size of the thread pool, if ZODB3 is used. NUMBER_OF_THREADS=4 sugesting we are running multi threaded. * the following modification of the Minimal Product How-To, suggests that requests are being processed single threaded:: from time import sleep, clock, time from OFS import SimpleItem 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() sleep(10) time2 = time() return '<html><body>Hello World<br>%s<br>%s<br></body></html>'%(time1,time2) 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>""" If I fire several requests to an instance of this class in rapid succession, Zope serializes them time1 of the second is after time2 of the first, time1 of the third is after time2 of the second and so on, suggesting that Zope is processing the requests purely sequentially. thanks Daniel
I found that the 'sequential' behaviour I was seeing from my product is an artifact of my browser. Daniel Daniel Mahler writes:
I am trying to figure out how Zope processes concurrent requests. I am running Zope using ZServer (without a webserver in front)
My initial investigations suggest contradictory answers:
* ZServer uses medusa, which uses asyncore which works by single threaded select multiplexing
* z2.py has::
# The size of the thread pool, if ZODB3 is used. NUMBER_OF_THREADS=4
sugesting we are running multi threaded.
* the following modification of the Minimal Product How-To, suggests that requests are being processed single threaded::
from time import sleep, clock, time
from OFS import SimpleItem
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() sleep(10) time2 = time() return '<html><body>Hello World<br>%s<br>%s<br></body></html>'%(time1,time2)
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>"""
If I fire several requests to an instance of this class in rapid succession, Zope serializes them time1 of the second is after time2 of the first, time1 of the third is after time2 of the second and so on, suggesting that Zope is processing the requests purely sequentially.
thanks Daniel
On Monday 08 Jul 2002 9:19 am, Daniel Mahler wrote:
I found that the 'sequential' behaviour I was seeing from my product is an artifact of my browser.
maybe, buts it is also a consquence of Zopes threading model. Zope uses threads, so two writes can run concurrently. If two concurrent transactions modify the same object then the second one gets aborted with a ConflictError. ZPublisher will retry a ConflictError up to 3 times.
participants (2)
-
Daniel Mahler -
Toby Dickenson