Jason Tackaberry wrote: > See the attached, which implements it the way I think it should be > (roughly). I think this is an elegant implementation. I didn't inherit > ThreadCallback from your BackgroundTask class because I couldn't get it > to work. You'll see what I mean when I try to make it go. :)
What do you think of the attached patch for NamedThreadCallback? The InProgressCallback could also be used for the new ThreadCallback, BackgroundTask can be removed. NOTICE: some parts of the code connect to a completed or exception signal for Thread. How do we handle that? Remove the signals? Dischi
Index: test/jobserver.py
===================================================================
--- test/jobserver.py (revision 2976)
+++ test/jobserver.py (working copy)
@@ -19,8 +19,7 @@
NamedThreadCallback('x', foo, 1)()
NamedThreadCallback('x', foo, 2)()
NamedThreadCallback(('x', 5), foo, 3)()
-j = NamedThreadCallback('x', foo, 4)
-j()
+j = NamedThreadCallback('x', foo, 4)()
NamedThreadCallback('x', foo, 5)()
NamedThreadCallback('y', foo, 6)()
j.stop()
Index: src/notifier/jobserver.py
===================================================================
--- src/notifier/jobserver.py (revision 2976)
+++ src/notifier/jobserver.py (working copy)
@@ -39,7 +39,7 @@
# kaa notifier imports
from callback import Signal, Callback
-from async import InProgress, BackgroundTask
+from async import InProgress
from thread import MainThreadCallback
import thread
@@ -73,7 +73,43 @@
return decorator
-class NamedThreadCallback(BackgroundTask, Callback):
+class InProgressCallback(InProgress):
+ def __init__(self, callback, *args, **kwargs):
+ InProgress.__init__(self)
+ self._callback = Callback(callback, *args, **kwargs)
+
+
+ def _execute(self):
+ """
+ Execute the callback. This function SHOULD be called __call__ but
+ InProgress.__call__ returns the result. This is deprecated but
+ still used.
+ """
+ if self._callback is None:
+ return None
+ try:
+ MainThreadCallback(self.finished, self._callback())()
+ except Exception, e:
+ e._exc_info = sys.exc_info()
+ MainThreadCallback(self.exception, e)()
+ self._callback = None
+
+
+ def active(self):
+ """
+ Return True if the callback is still waiting to be proccessed.
+ """
+ return self._callback is not None
+
+
+ def stop(self):
+ """
+ Remove the callback from the thread schedule if still active.
+ """
+ self._callback = None
+
+
+class NamedThreadCallback(Callback):
"""
A callback to run a function in a thread. This class is used by
execute_in_thread, but it is also possible to use this call directly.
@@ -82,46 +118,27 @@
"""
def __init__(self, thread_information, func, *args, **kwargs):
Callback.__init__(self, func, *args, **kwargs)
- BackgroundTask.__init__(self)
self.priority = 0
if isinstance(thread_information, (list, tuple)):
thread_information, self.priority = thread_information
- self._thread_name = thread_information
- self._server = None
+ self._thread = thread_information
- def active(self):
- """
- Return True if the callback is still waiting to be proccessed.
- """
- return self._server != None
+ def _create_job(self, *args, **kwargs):
+ cb = Callback._get_callback(self)
+ job = InProgressCallback(cb, *args, **kwargs)
+ job.priority = self.priority
+ if not _threads.has_key(self._thread):
+ _threads[self._thread] = _Thread(self._thread)
+ server = _threads[self._thread]
+ server.add(job)
+ return job
- @BackgroundTask.start_background_task()
- def __call__(self, *args, **kwargs):
- """
- Schedule the callback function on the server, returns an InProgress
- object.
- """
- if self._server:
- raise RuntimeError('NamedThreadCallback already scheduled')
- if not _threads.has_key(self._thread_name):
- _threads[self._thread_name] = _Thread(self._thread_name)
- self._named_thread_args = args, kwargs
- self._server = _threads[self._thread_name]
- self._server.add(self)
+ def _get_callback(self):
+ return self._create_job
- def stop(self):
- """
- Remove the callback from the thread schedule if still active.
- """
- if self.active():
- self._server.remove(self)
- self._server = None
- self._named_thread_args = None
-
-
class _Thread(threading.Thread):
"""
Thread processing NamedThreadCallback jobs.
@@ -183,16 +200,7 @@
continue
job = self.jobs.pop(0)
self.condition.release()
- # process the job
- job._server = None
- try:
- args, kwargs = job._named_thread_args
- job._named_thread_args = None
- r = Callback.__call__(job, *args, **kwargs)
- MainThreadCallback(job.signals['completed'].emit, r)()
- except Exception, e:
- e._exc_info = sys.exc_info()
- MainThreadCallback(job.signals['exception'].emit, e)()
+ job._execute()
# server stopped
log.debug('stop thread %s' % self.name)
-- We live in a society where pizza gets to your house before the police.
pgpHUQTgYYHYD.pgp
Description: PGP signature
------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________ Freevo-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/freevo-devel
