首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向运行中的python线程发送数据?

如何向运行中的python线程发送数据?
EN

Stack Overflow用户
提问于 2014-09-18 05:08:36
回答 1查看 30.2K关注 0票数 21

在我的应用程序中,有一个类在单独的线程中运行。我可以一次运行多个线程,线程是守护进程。经过一段时间后,这些线程中的一些需要接收和处理消息。我该怎么做?

我的代码示例如下:

代码语言:javascript
复制
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!")

这一产出如下:

代码语言:javascript
复制
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!,如下所示:

代码语言:javascript
复制
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的代码来解决上面的问题,它似乎不会响应这些新消息。

代码语言:javascript
复制
for t in threads:
    t.queue.put("Print this again!")
    time.sleep(0.1)

在这种情况下,我希望输出的结果如下所示

代码语言:javascript
复制
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!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-18 05:21:02

为此,可以使用Queue.Queue (或Python3中的queue.Queue ):

代码语言:javascript
复制
import threading
import time 
from Queue import Queue

print_lock = threading.Lock()

class MyThread(threading.Thread):
    def __init__(self, queue, args=(), kwargs=None):
        threading.Thread.__init__(self, args=(), kwargs=None)
        self.queue = queue
        self.daemon = True
        self.receive_messages = args[0]

    def run(self):
        print threading.currentThread().getName(), self.receive_messages
        val = self.queue.get()
        self.do_thing_with_message(val)

    def do_thing_with_message(self, message):
        if self.receive_messages:
            with print_lock:
                print threading.currentThread().getName(), "Received {}".format(message)

if __name__ == '__main__':
    threads = []
    for t in range(10):
        q = Queue()
        threads.append(MyThread(q, args=(t % 2 == 0,)))
        threads[t].start()
        time.sleep(0.1)

    for t in threads:
        t.queue.put("Print this!")

    for t in threads:
        t.join()

我们向每个线程传递一个Queue实例,并使用queue.put将消息发送到Thread。我们等待消息到达run方法,它是Thread对象的一部分,实际上运行在单独的执行线程中。一旦我们得到消息,我们就调用do_thing_with_message,它将在同一个后台线程中运行。

我还在代码中添加了一个threading.Lock,这样到stdout的打印就不会混淆。

编辑:

如果希望能够向线程传递多条消息,只需使用一个循环:

代码语言:javascript
复制
def run(self):
    print threading.currentThread().getName(), self.receive_messages
    while True:
        val = self.queue.get()
        if val is None:   # If you send `None`, the thread will exit.
            return
        self.do_thing_with_message(val)
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25904537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档