[Checkins] SVN: lovely.remotetask/trunk/ fixed bug in associating
threads with task service instances
Fred L. Drake, Jr.
fdrake at gmail.com
Mon Nov 5 11:57:27 EST 2007
Log message for revision 81533:
fixed bug in associating threads with task service instances
Changed:
U lovely.remotetask/trunk/CHANGES.txt
U lovely.remotetask/trunk/src/lovely/remotetask/README.txt
U lovely.remotetask/trunk/src/lovely/remotetask/service.py
-=-
Modified: lovely.remotetask/trunk/CHANGES.txt
===================================================================
--- lovely.remotetask/trunk/CHANGES.txt 2007-11-05 16:34:00 UTC (rev 81532)
+++ lovely.remotetask/trunk/CHANGES.txt 2007-11-05 16:57:26 UTC (rev 81533)
@@ -2,6 +2,11 @@
Changes for lovely.remotetask
=============================
+unreleased:
+===========
+
+- fixed bug in associating threads with task service instances
+
2007/10/28 0.2.12:
==================
Modified: lovely.remotetask/trunk/src/lovely/remotetask/README.txt
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/README.txt 2007-11-05 16:34:00 UTC (rev 81532)
+++ lovely.remotetask/trunk/src/lovely/remotetask/README.txt 2007-11-05 16:57:26 UTC (rev 81533)
@@ -56,7 +56,7 @@
>>> service.__parent__ is sm['default']
True
-Let's register it under the name `TestTaskService`:
+Let's register it under the name `TestTaskService1`:
>>> from zope import component
>>> from lovely.remotetask import interfaces
@@ -583,6 +583,87 @@
3
+Threading behavior
+------------------
+
+Each task service runs in a separate thread, allowing them to operate
+independently. Tasks should be designed to avoid conflict errors in
+the database.
+
+Let's start the task services we have defined at this point, and see
+what threads are running as a result::
+
+ >>> service.startProcessing()
+ >>> root_service.startProcessing()
+
+ >>> import pprint
+ >>> import threading
+
+ >>> def show_threads():
+ ... threads = [t for t in threading.enumerate()
+ ... if t.getName().startswith('remotetasks.')]
+ ... threads.sort(key=lambda t: t.getName())
+ ... pprint.pprint(threads)
+
+ >>> show_threads()
+ [<Thread(remotetasks.rootTaskService, started daemon)>,
+ <Thread(remotetasks.site1.++etc++site.default.testTaskService1, started daemon)>]
+
+Let's add a second site containing a task service with the same name as the
+service in the first site::
+
+ >>> site2 = Folder()
+ >>> service2 = remotetask.TaskService()
+
+ >>> root['site2'] = site2
+ >>> sm = LocalSiteManager(removeSecurityProxy(site2))
+ >>> site2.setSiteManager(sm)
+
+ >>> sm['default']['testTaskService1'] = service2
+ >>> service2 = sm['default']['testTaskService1'] # caution! proxy
+
+Let's register it under the name `TestTaskService1`::
+
+ >>> sm = site2.getSiteManager()
+ >>> sm.registerUtility(
+ ... service2, interfaces.ITaskService, name='TestTaskService1')
+
+The service requires that it's been committed to the database before it can
+be used::
+
+ >>> transaction.commit()
+
+The new service isn't currently processing::
+
+ >>> service2.isProcessing()
+ False
+
+If we start the new service, we can see that there are now three background
+threads:
+
+ >>> service2.startProcessing()
+ >>> show_threads()
+ [<Thread(remotetasks.rootTaskService, started daemon)>,
+ <Thread(remotetasks.site1.++etc++site.default.testTaskService1, started daemon)>,
+ <Thread(remotetasks.site2.++etc++site.default.testTaskService1, started daemon)>]
+
+Let's stop the services, and give the background threads a chance to get the
+message::
+
+ >>> service.stopProcessing()
+ >>> service2.stopProcessing()
+ >>> root_service.stopProcessing()
+
+ >>> import time
+ >>> time.sleep(0.5)
+
+The threads have exited now::
+
+ >>> print [t for t in threading.enumerate()
+ ... if t.getName().startswith('remotetasks.')]
+ []
+
+
Footnotes
---------
Modified: lovely.remotetask/trunk/src/lovely/remotetask/service.py
===================================================================
--- lovely.remotetask/trunk/src/lovely/remotetask/service.py 2007-11-05 16:34:00 UTC (rev 81532)
+++ lovely.remotetask/trunk/src/lovely/remotetask/service.py 2007-11-05 16:57:26 UTC (rev 81533)
@@ -186,7 +186,12 @@
"""Return name of the processing thread."""
# This name isn't unique based on the path to self, but this doesn't
# change the name that's been used in past versions.
- return 'remotetasks.' + self.__name__
+ path = [parent.__name__ for parent in zapi.getParents(self)
+ if parent.__name__]
+ path.append('remotetasks')
+ path.reverse()
+ path.append(self.__name__)
+ return '.'.join(path)
def processNext(self, now=None):
job = self._pullJob(now)
More information about the Checkins
mailing list