Python多线程队列jobs.put能否传入多参数?如何实现?
用Python队列实现多线程任务调度(多参数任务)
当然可以给任务队列传入多个值,核心是把多个值打包成单个对象(比如元组、列表或字典)存入队列,取出后再解包使用。你的代码有几个关键问题导致输出不符合预期,下面是修正方案:
问题分析
- 队列存值错误:
queue.Queue.put()只能接收一个位置参数,不能直接传入两个值org_id和org_name,需要把它们打包成元组/列表。 - 取值方式错误:
q.get()的参数是阻塞设置和超时时间,不是索引,不能用q.get(0)或q.get(1)来分别取两个值,应该一次取出打包好的对象再解包。 - 线程参数错误:
threading.Thread的args需要是元组,args=(jobs)会被解析成单个元素,不是元组,必须加逗号写成args=(jobs,)。 - 冗余参数:
do_stuff函数的t参数未使用,可以移除。
修正后的代码
import threading import queue import random import time def do_stuff(q): while True: # 取出队列中的元组并解包 org_id, org_name = q.get() slpTmr = random.randint(1, 3) time.sleep(slpTmr) print(f"{org_id} [{org_name}] slept for: {slpTmr}") q.task_done() # 模拟数据源 orgs_search = [ {"id": 123, "name": "org1"}, {"id": 142, "name": "org2"}, {"id": 123, "name": "org3"}, {"id": 342, "name": "org4"}, {"id": 0, "name": "invalid_org"} ] jobs = queue.Queue() maxThreads = 4 # 把任务打包成元组存入队列 for org in orgs_search: org_id = org["id"] org_name = org["name"] if org_id == 0: continue jobs.put( (org_id, org_name) ) # 打包成元组 # 创建并启动线程 for i in range(maxThreads): worker = threading.Thread(target=do_stuff, args=(jobs,)) # args必须是元组,加逗号 worker.daemon = True # 设置守护线程,主程序退出时线程自动结束 worker.start() jobs.join() # 等待所有任务完成
关键说明
- 打包多参数:用
(org_id, org_name)把两个值打包成元组,存入队列;也可以用列表[org_id, org_name]或字典{"id": org_id, "name": org_name},取出时对应解包即可。 - 安全取值:
q.get()会阻塞直到队列有数据,不需要用while not q.empty()判断(多线程下这个判断不可靠),配合q.task_done()和jobs.join()可以确保所有任务执行完成。 - 守护线程:设置
worker.daemon = True,主程序执行到jobs.join()后会等待所有任务完成,之后自动退出,无需手动终止线程。
内容的提问来源于stack exchange,提问作者John A
相关产品推荐
相关产品推荐

