我有一个Thread
(1)正在侦听输入信号,当它收到信号时,另一个Thread
(2)应该采取行动。我是否应该在两个线程之间共享一个Queue
并在(1)中将函数放入其中并在一个大的while循环中将它们放入(2)中。 python
是否提供了在线程之间传递函数调用的更好方法?
答案 0 :(得分:1)
我会使用队列。
如果您使用的是threading.Condition或threading.Event,我认为没有办法告诉工作线程有多个输入要处理。 它们在线程之间提供的通信设备更像是切换开关 - 打开或关闭,通知或等待。
因此,如果Thread(2)在处理信号的过程中,而Thread(1)收到另一个信号,则Thread(1)将没有一个好方法告诉Thread(2)另一个信号已经到了。相反,Queue会将所有鸭子(信号)整齐地排列在一行,并允许Thread(2)逐个处理它们。
import threading
import datetime as DT
import time
import Queue
import random
import itertools
sentinel = None
def worker(queue):
for date, count in iter(queue.get, sentinel):
now = DT.datetime.now()
print('{}: Signal found at {}, processed at {}'
.format(count, date.strftime('%S.%f'), now.strftime('%S.%f')))
time.sleep(random.random()*5)
queue = Queue.Queue()
t = threading.Thread(target=worker, args=(queue, ))
t.daemon = True
t.start()
c = 0
while True:
if random.random() < 0.05:
queue.put((DT.datetime.now(), c))
c += 1
if c >= 5:
# Tell worker to quit
queue.put(sentinel)
t.join()
break
将打印类似
的内容0: Signal found at 27.308544, processed at 27.308705
1: Signal found at 27.308585, processed at 30.379586
2: Signal found at 27.308601, processed at 35.174354
3: Signal found at 27.308607, processed at 36.649155
4: Signal found at 27.308622, processed at 37.234935
请注意,信号都是在27.3左右找到/生成的(在主线程中),但是直到很久以后才处理(在工作线程中)。