Python 如何在脚本运行时向多处理队列添加更多项
我正在尝试学习使用队列进行多处理 我想做的是找出脚本运行时何时/如何“向队列添加更多项目” 以下脚本是我工作的基准:Python 如何在脚本运行时向多处理队列添加更多项,python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,我正在尝试学习使用队列进行多处理 我想做的是找出脚本运行时何时/如何“向队列添加更多项目” 以下脚本是我工作的基准: import multiprocessing class MyFancyClass: def __init__(self, name): self.name = name def do_something(self): proc_name = multiprocessing.current_process().name
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更改为
def worker(q):
while not q.empty():
obj = q.get()
obj.do_something()
原始代码的问题是,worker在处理队列中的一个项目后返回。你需要某种循环逻辑
这个解决方案是不完美的,因为empty()不是。如果队列在添加更多项目之前变为空,也将失败(进程将返回)
我建议使用一种新的方法
非常接近您要查找的内容。让我们明确一点:
- 在上述方案中,只调用一次目标函数
。在第一次调用时,函数将暂停等待阻塞操作的结果worker(q)
。它从q.get()
获取实例队列
,调用其MyFancyClass('Fancy Dan')
方法并完成do\u something
将被放入队列,但不会进入进程,因为进程的目标函数已完成MyFancyClass('Frankie')
- 其中一种方法是从队列中读取数据并等待一个信号/标记项,该信号/标记项表示队列使用已停止。假设
valueNone
输出:
Doing something fancy in Process-1 for Fancy Dan!
Doing something fancy in Process-1 for Frankie!
“弗兰基确实进入了队列”-弗兰基不会去游行是的
queue.qsize()
确实能识别Frankie
,但Frankie
无法识别工人。嘿,罗曼……谢谢你的回答。我有个问题。为什么两者都是“过程1”?Thanks@arcee123,您只有一个进程(具有不同的名称)和多个要处理的队列项OK。我有一个问题需要允许多个进程(池)访问它。我再问另一个问题。
Doing something fancy in Process-1 for Fancy Dan!
Doing something fancy in Process-1 for Frankie!