Python 发出队列上作业结束的信号?

Python 发出队列上作业结束的信号?,python,multithreading,queue,message-queue,python-multithreading,Python,Multithreading,Queue,Message Queue,Python Multithreading,下面是Python文档中的示例代码: def worker(): while True: item = q.get() do_work(item) q.task_done() q = Queue() for i in range(num_worker_threads): t = Thread(target=worker) t.daemon = True t.start() for item in sourc

下面是Python文档中的示例代码:

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done
我将其修改为适合我的用例,如下所示:

import threading
from Queue import Queue

max_threads = 10

q = Queue(maxsize=max_threads + 2)

def worker():
  while True:
    task = q.get(1)
    # do something with the task
    q.task_done()

for i in range(max_threads):
  t = threading.Thread(target=worker)
  t.start()

for task in ['a', 'b', 'c']:
  q.put(task)

q.join()
当我执行它时,调试器说所有的作业都已执行,但q.join()似乎一直在等待。如何向工作线程发送一个信号,表明我已经发送了所有任务?

q.join()
实际返回。您可以通过在
q.join()
行之后放置
print(“done”)
来测试这一点

....
q.join()
print('done')
那么,为什么不结束这个项目呢? 因为,默认情况下,线程是非守护进程线程

您可以使用将线程设置为守护进程线程

适用于范围内的i(最大线程数):
t=线程。线程(目标=工作线程)

t、 daemon=True#此进程不会在
.join()
处结束,因为工作线程继续等待新队列数据(阻塞
.get()

这里有一个方法,它使用一个简单的标志
finishUp
告诉工作人员退出,我们在
.join()
完成后设置这个标志,这意味着所有任务都被处理。我在
q.get()

import threading
import queue

max_threads = 5
q = queue.Queue(maxsize=max_threads + 2)
finishUp = False

def worker():
    while True:
        try:
            task = q.get(block=True, timeout=1)
            # do something with the task
            print ("processing task for:"+str(task))
            q.task_done()
        except Exception as ex: # we get this exception when queue is empty
            if finishUp:
                print ("thread finishing because processing is done")
                return

for i in range(max_threads):
  t = threading.Thread(target=worker)
  t.start()

for task in ['a', 'b', 'c']:
  q.put(task)

print ("waiting on join")
q.join()
finishUp = True  # let the workers know that they can exit
print ("finished")
这将产生以下输出:

waiting on join
processing task for:a
processing task for:b
processing task for:c
finished
thread finishing because processing is done
thread finishing because processing is done
thread finishing because processing is done
thread finishing because processing is done
thread finishing because processing is done

Process finished with exit code 0

我定义了一个
DONE
对象来表示工作结束:

DONE=object()
当上级知道不再有数据时,将其放入队列:

q.put\u nowait(完成)
在工作线程中,一旦接收到对象,线程就会退出。 但是,如果有其他线程侦听同一队列,我们必须将对象放回队列:

item=q.get()
如果项目已完成:
q、 放置(完成)
返回

干杯:)

可能的最新输入错误:当循环变量为
tasks
时,您是否打算将
task
放入队列中?我不这么认为……是的,是打字错误。谢谢,我编辑了它。对包含thread.exit()的任务进行排队?过了一会儿,我注意到了它,并将它与文档中的代码进行了比较。谢谢!;)在本例中,在主Python进程终止后,守护进程工作线程是否永远存在?或者它们被清理了吗?@TravisBear,如果只有主线程和守护线程,以及主线程端,程序端。但如果有任何非守护进程线程,它将不会结束。
waiting on join
processing task for:a
processing task for:b
processing task for:c
finished
thread finishing because processing is done
thread finishing because processing is done
thread finishing because processing is done
thread finishing because processing is done
thread finishing because processing is done

Process finished with exit code 0