python - 队列不继续?
问题描述
我知道我在做一些愚蠢的事情,但我无法弄清楚!我正在通过 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")
解决方案
在你调用 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() 感到满意。您可以通过注释该代码块来尝试多线程。
推荐阅读
- wpf - 如何根据 TextBox 值绑定控件(StackPanel)的可见性?
- python - pd get 虚拟值编码与列增长作斗争
- mysql - 使用 if 语句创建触发器时 MySql 错误 1064
- excel - Workbook_Open() 不适用于工作簿保护
- php - 如何首先验证多个文件,然后仅在它们有效时才将其余的表单数据添加到数据库中?
- javascript - 如何阻止加载强制在我的网站管理面板上显示广告的外部脚本
- javascript - 如何正确居中项目(固定宽度 - 滑动滑动)?
- java - 显示我订购的所有商品
- spring-boot - 在 spring boot 2.3.3 中,面临有关 CORS 的问题。没有使用弹簧安全
- vue.js - Nuxtjs 组件不会在 v-if 条件更改时重新加载