要求另一个线程做某事

时间:2014-03-18 11:31:31

标签: python multithreading events notifications queue

我有一个Thread(1)正在侦听输入信号,当它收到信号时,另一个Thread(2)应该采取行动。我是否应该在两个线程之间共享一个Queue并在(1)中将函数放入其中并在一个大的while循环中将它们放入(2)中。 python是否提供了在线程之间传递函数调用的更好方法?

1 个答案:

答案 0 :(得分:1)

我会使用队列。

如果您使用的是threading.Conditionthreading.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左右找到/生成的(在主线程中),但是直到很久以后才处理(在工作线程中)。