带有同步队列的python线程

时间:2016-02-19 06:40:43

标签: python python-3.5

我有一个脚本遵循此示例中的相同逻辑。 基本上我将项目插入到全局队列中,并使用while循环生成线程,该循环从队列和调用task_done获取和。

如果我的while循环检查队列是否为空,我可以让线程加入,但我想尝试合并一个标志,我可以自己设置退出循环。当我尝试这样做时,加入线程永远阻止。

以下是不加入线程的非工作样本:

import threading
import queue

class Mythread(threading.Thread):
    def __init__(self):
        super().__init__()
        self.signal = False
    def run(self):
       global queue
       while not self.signal:
           item = q.get()
           print(item)
           q.task_done()
    def stop(self):
       self.signal = True

q = queue.Queue
for i in range(5000):
   q.put(i)

threads = []
for i in range(2):
    t = Mythread()
    threads.append(t)

for t in threads:
    t.start()
q.join()

for t in threads:
    print(t.signal)   <---- False
    t.stop()             
    print(t.signal)   <---- True
    t.join()          <---- Blocks forever

这是使用队列空

工作的那个
import threading
import queue

class Mythread(threading.Thread):
    def __init__(self):
        super().__init__()
    def run(self):
        global queue
        while not q.empty():
            item = q.get()
            print(item)
            q.task_done()

q = queue.Queue
for i in range(5000):
   q.put(i)

threads = []
for i in range(2):
    t = Mythread()
    threads.append(t)

for t in threads:
    t.start()

q.join()

for t in threads:
    t.join()          <---- Works fine
    print(t.is_alive())   <--- returns False

有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

q.get阻止所以它不会达到你的状态