gpt4 book ai didi

python - 如何在脚本运行时向多处理队列添加更多项目

转载 作者:行者123 更新时间:2023-12-01 00:49:28 24 4
gpt4 key购买 nike

我正在尝试使用队列学习多处理。

我想做的是弄清楚当脚本运行时何时/如何“向队列添加更多项目”。

以下脚本是我正在工作的基线:

import multiprocessing


class MyFancyClass:

def __init__(self, name):
self.name = name

def do_something(self):
proc_name = multiprocessing.current_process().name
print('Doing something fancy in {} for {}!'.format(
proc_name, self.name))


def worker(q):
obj = q.get()
obj.do_something()


if __name__ == '__main__':
queue = multiprocessing.Queue()

p = multiprocessing.Process(target=worker, args=(queue,))
p.start()

queue.put(MyFancyClass('Fancy Dan'))
queue.put(MyFancyClass('Frankie'))
print(queue.qsize())

# Wait for the worker to finish
queue.close()
queue.join_thread()
p.join()

在第 26 行,Fancy Dan 注入(inject)有效,但 Frankie 片段无效。我可以确认 Frankie 确实进入了队列。我需要一个可以“检查更多项目”并根据需要将它们插入队列的位置。如果不再存在任何项目,则在现有项目清除后关闭队列。

我该怎么做?

谢谢!

最佳答案

让我们说清楚:

  • 目标函数worker(q)在上述方案中只会被调用一次。在第一次调用时,该函数将暂停等待阻塞操作 q.get() 的结果。它从队列获取实例MyFancyClass('Fancy Dan'),调用其do_something方法并完成。
  • MyFancyClass('Frankie') 将被放入队列中,但不会进入 Process,因为进程的目标函数已完成。
  • 其中一种方法是从队列中读取并等待信号/标记项,该信号/标记项表示队列使用已停止。假设为None 值。
<小时/>
import multiprocessing


class MyFancyClass:

def __init__(self, name):
self.name = name

def do_something(self):
proc_name = multiprocessing.current_process().name
print('Doing something fancy in {} for {}!'.format(proc_name, self.name))


def worker(q):
while True:
obj = q.get()
if obj is None:
break
obj.do_something()


if __name__ == '__main__':
queue = multiprocessing.Queue()

p = multiprocessing.Process(target=worker, args=(queue,))
p.start()

queue.put(MyFancyClass('Fancy Dan'))
queue.put(MyFancyClass('Frankie'))
# print(queue.qsize())
queue.put(None)

# Wait for the worker to finish
queue.close()
queue.join_thread()
p.join()

输出:

Doing something fancy in Process-1 for Fancy Dan!
Doing something fancy in Process-1 for Frankie!

关于python - 如何在脚本运行时向多处理队列添加更多项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56687113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com