[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