作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用队列学习多处理。
我想做的是弄清楚当脚本运行时何时/如何“向队列添加更多项目”。
以下脚本是我正在工作的基线:
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/
我是一名优秀的程序员,十分优秀!