1 import threading
2 import sys
3 from Queue import *
4 import time
5
6
7
8
11 try:
12 import psyco
13 psyco.full()
14 except ImportError:
15 pass
16 threading.Thread.__init__(self)
17 self.post_mutex = threading.Lock()
18 self.mutex = threading.Lock()
19 self.not_empty = threading.Condition(self.mutex)
20 self.not_full = threading.Condition(self.mutex)
21 self.setDaemon(True)
22
23 self.__messages = Queue(0)
24
47 """
48 def receive(self):
49 #returns a message if available
50 #else returns None
51 return self.__getMessage(False, None)
52 """
53 - def _receive(self, block = False, timeout = None, template = None):
54 """
55 waits for a message during timeout
56 if timeout == None waits until a message is received
57 if no message is received returns None
58 """
59
60 if not template:
61 return self.__getMessage(block, timeout)
62 else:
63 self.not_empty.acquire()
64 for msg in self.__messages.queue:
65 if template.match(msg):
66 self.not_empty.release()
67 self.__messages.queue.remove(msg)
68 return msg
69 self.not_empty.release()
70 if not block: return None
71 else:
72 endtime = time.time()+timeout
73 self.not_empty.acquire()
74 while True:
75 for msg in self.__messages.queue:
76 if template.match(msg):
77 self.not_empty.release()
78 self.__messages.queue.remove(msg)
79 return msg
80 remaining = endtime - time.time()
81 if timeout and remaining <= 0.0:
82 self.not_empty.release()
83 return None
84 self.not_empty.wait(remaining)
85
86 - def postMessage(self, message):
87 if (message != None):
88 self.post_mutex.acquire()
89
90 self.not_full.acquire()
91 self.__messages.put(message,block=True)
92 self.not_empty.notify()
93 self.not_full.release()
94
95 self.post_mutex.release()
96 return True
97