【发布时间】:2014-09-18 05:08:36
【问题描述】:
我有一个在我的应用程序的单独线程中运行的类。我可以同时运行多个线程,这些线程是守护进程。一段时间后,这些线程中有一些需要接收和处理消息。我该怎么做?
我的代码示例如下所示:
import threading
import time
class MyThread(threading.Thread):
def __init__(self, args=(), kwargs=None):
threading.Thread.__init__(self, args=(), kwargs=None)
self.daemon = True
self.receive_messages = args[0]
def run(self):
print threading.currentThread().getName(), self.receive_messages
def do_thing_with_message(self, message):
if self.receive_messages:
print threading.currentThread().getName(), "Received %s".format(message)
if __name__ == '__main__':
threads = []
for t in range(10):
threads.append( MyThread(args=(t % 2 == 0,)))
threads[t].start()
time.sleep(0.1)
for t in threads:
t.do_thing_with_message("Print this!")
这个输出:
Thread-1 True
Thread-2 False
Thread-3 True
Thread-4 False
Thread-5 True
Thread-6 False
Thread-7 True
Thread-8 False
Thread-9 True
Thread-10 False
MainThread Received %s
MainThread Received %s
MainThread Received %s
MainThread Received %s
MainThread Received %s
但是,我希望最后五行与MainThread 无关,而不是%s,我希望它与Print this! 相关,如下所示:
Thread-1 True
Thread-2 False
Thread-3 True
Thread-4 False
Thread-5 True
Thread-6 False
Thread-7 True
Thread-8 False
Thread-9 True
Thread-10 False
Thread-1 Received Print this!
Thread-3 Received Print this!
Thread-5 Received Print this!
Thread-7 Received Print this!
Thread-9 Received Print this!
我怎样才能正确地向正在运行的线程发送这样的消息?
附录:
如果我在Print this! 块之后有这个块,并利用@dano 的代码解决上述问题,它似乎没有响应这些新消息。
for t in threads:
t.queue.put("Print this again!")
time.sleep(0.1)
在这种情况下,我希望我的输出的结尾看起来像这样
Thread-1 Received Print this!
Thread-3 Received Print this!
Thread-5 Received Print this!
Thread-7 Received Print this!
Thread-9 Received Print this!
Thread-1 Received Print this again!
Thread-3 Received Print this again!
Thread-5 Received Print this again!
Thread-7 Received Print this again!
Thread-9 Received Print this again!
【问题讨论】:
-
这就是 task queues 的设计目的。
-
@BurhanKhalid 我会说在这里使用像 Celery 这样的东西会有点矫枉过正。 Celery 对于将工作分配给集群中的多个进程或多台机器绝对有用,但这里更简单的东西将满足 OP 的需求。
标签: python multithreading