你可以将多个参数传递到 jobs.put 中吗?

问题描述 投票:0回答:1

所以我想在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 
python job-scheduling
1个回答
0
投票

您应该使用

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()
© www.soinside.com 2019 - 2024. All rights reserved.