首页 > 解决方案 > 队列不继续?

问题描述

我知道我在做一些愚蠢的事情,但我无法弄清楚!我正在通过 1 个线程进行测试。它应该在队列中添加最多十个项目,等待它完成,然后说“完成”。线程函数的末尾有 q.task_done()。但它会说“任务完成”,但它只是暂停,从不说“完成”。

def helper(q):
     print("Started")
     ....
     q.task_done()
     print("Task done")

def main():
    q = Queue(maxsize=0)
    recid = 9000000
    num_threads = 1

    for i in range(num_threads):
        worker = Thread(target=helper, args=(q))
        worker.setDaemon(True)
        worker.start()

    while recid > 0:
        batch.clear()
        for x in range(10):
            q.put(recid)
            print("Added request.")
            recid -= 1

        print("Waiting for threads to finish.")
        q.join()
        print("Finished")

标签: pythonmultithreading

解决方案


在你调用 q.join() 之前,worker 已经死了。也许尝试在等待 q.put() 的 helper() 中添加一些延迟

def helper(q):
    print("Started")
    time.sleep(1)                 # wait for main() q.put()
    while not q.empty():          # until queue is empty
        print("request", q.get())
        q.task_done()             # trigger q.join in main()
        print("Task done")
        time.sleep(1)             # wait for next q.put() if exists

更新:

基本上,helper() 中的 q.task_done() 会触发 main() 中的 q.join(),一旦 helper() 退出,就会触发 worker.join()。示例代码如下:

def main():
    q = Queue(maxsize=0)
    recid = 100
    num_threads = 4

    while recid > 0:
        for i in range(num_threads):
            print('''******** Hired Worker %d ********'''%(i),)
            worker = Thread(target=helper, args=(q,))
            worker.setDaemon(True)
            worker.start()

            # batch.clear()
            for x in range(3):
                q.put(recid)
                print("Request Worker %d to do %d."%(i, recid))
                recid -= 1

            ##############################################################
            # Comment these lines when you are ready to test multiThread 
            ##############################################################
                print("Waiting Worker %d to finish %d."%(i, recid))
                q.join()    # triggered by q.task_done in helper()
                print("Worker %d Finished %d"%(i, recid))

            print("Waiting for Worker %d to leave."%i)
            worker.join()   # triggered once helper() is exited
            print("!!!!!!!! Worker %d left !!!!!!!!"%i)
            ##############################################################    

    time.sleep(5)      # wait until all requests are finished.
    print("Finished")

一旦你对线程和队列的 join() 感到满意。您可以通过注释该代码块来尝试多线程。


推荐阅读