Pyt*_*ice 14 python multithreading
我有一个在我的应用程序中的不同线程中运行的类.我可以一次运行多个线程,线程是守护进程.一段时间后,其中一些线程需要接收和处理消息.我该怎么做呢?
我的代码示例如下所示:
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!
dan*_*ano 14
您可以使用Queue.Queue(或queue.Queue在Python 3中):
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实例传递给每个线程,并将我们的消息发送给Threadusing queue.put.我们等待消息到达run方法,该方法是Thread实际在单独的执行线程中运行的对象的一部分.一旦我们收到消息,我们就会调用do_thing_with_message,它将在同一个后台线程中运行.
我还在threading.Lock代码中添加了一个,因此stdout的打印件不会混淆.
编辑:
如果您希望能够向线程传递多条消息,只需使用循环:
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)
| 归档时间: | 
 | 
| 查看次数: | 14402 次 | 
| 最近记录: |