Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在脚本运行时向多处理队列添加更多项_Python_Python 3.x_Multiprocessing_Python Multiprocessing - Fatal编程技术网

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')
    将被放入队列,但不会进入进程,因为进程的目标函数已完成
  • 其中一种方法是从队列中读取数据并等待一个信号/标记项,该信号/标记项表示队列使用已停止。假设
    None
    value

输出:

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!