所以我想在Python中使用队列多线程,我在其中对作业进行排队并通过作业进行工作,但我有两个值想传递给每个作业。我可以将多个值传递到作业队列中吗?如何检索数据?
我尝试了以下方法:
def do_stuff(q, t):
while not q.empty():
value = q.get(0)
orgName = q.get(1)
slpTmr = random.randint(1, 3)
time.sleep(slpTmr)
print(str(value) + "[" + orgName + "] slept for: " + str(slpTmr))
q.task_done()
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))
worker.start()
但它没有按预期打印,我希望的是这样的输出:
123 [org1] slept for 2
142 [org2] slept for 4
123 [org3] slept for 3
342 [org4] slept for 1
您应该使用
ThreadPoolExecutor()
或多处理 ThreadPool
库对象,而不是自己滚动,但为了练习:
.get()
两次!)join()
队列和工作线程。import random
import threading
import time
from queue import Queue
def do_stuff(queue):
while not queue.empty():
value, orgName = queue.get()
slpTmr = random.uniform(1, 3)
time.sleep(slpTmr)
print(f"{value} [{orgName}] slept for {slpTmr}")
queue.task_done()
def main():
jobs = Queue()
orgs_search = [
{"id": 0, "name": "Apple"},
{"id": 1, "name": "Microsoft"},
{"id": 2, "name": "Google"},
{"id": 3, "name": "Disney"},
]
for org in orgs_search:
org_id = org["id"]
org_name = org["name"]
if org_id == 0:
continue
jobs.put((org_id, org_name))
max_threads = 2
workers = [threading.Thread(target=do_stuff, args=(jobs,)) for _ in range(max_threads)]
for worker in workers:
worker.start()
jobs.join()
print("Jobs are done!")
for worker in workers:
worker.join()
print("Workers are done!")
main()