]> code.delx.au - offlineimap/commitdiff
Yet another Python threading workaround.
authorJohn Goerzen <jgoerzen@complete.org>
Tue, 5 Aug 2008 05:05:29 +0000 (00:05 -0500)
committerJohn Goerzen <jgoerzen@complete.org>
Tue, 5 Aug 2008 05:05:29 +0000 (00:05 -0500)
module threading should be taken out back and shot.

Condition.wait() is a busywait loop that has negative implications for
battery consumption on laptops.

Queue.get() in blocking mode blocks SIGINT from being delivered.

Argh, argh, argh.

Closes: #493801.
offlineimap/threadutil.py

index 5f537086370b24fcf2aa512c98f849b4dd9a574a..f1df5b2d84351596eccda09ba4247d9e3b837276 100644 (file)
@@ -18,8 +18,8 @@
 
 from threading import *
 from StringIO import StringIO
-from Queue import Queue
-import sys, traceback, thread
+from Queue import Queue, Empty
+import sys, traceback, thread, time
 from offlineimap.ui import UIBase       # for getglobalui()
 
 profiledir = None
@@ -89,7 +89,7 @@ class threadlist:
 # Exit-notify threads
 ######################################################################
 
-exitthreads = Queue(5)
+exitthreads = Queue(100)
 inited = 0
 
 def initexitnotify():
@@ -112,8 +112,14 @@ def exitnotifymonitorloop(callback):
     """
     global exitthreads
     while 1:                            # Loop forever.
-        callback(exitthreads.get(True))
-        exitthreads.task_done()
+        try:
+            thrd = exitthreads.get(False)
+            print "exitnotifymonitorloop: Got thread\n"
+            callback(thrd)
+            print "exitnotifymonitorloop: callback done\n"
+            exitthreads.task_done()
+        except Empty:
+            time.sleep(1)
 
 def threadexited(thread):
     """Called when a thread exits."""