gpt4 book ai didi

python - 尝试理解跨 python 模块的多处理和队列

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

我正在尝试了解多重处理。我的实际应用是在 pyqt5 GUI 上实时显示日志消息,但是我在使用队列时遇到了一些问题,所以我编写了一个简单的程序来测试它。

我看到的问题是我无法跨 python 模块和跨进程将元素添加到队列中。这是我的代码和输出,以及预期的输出。

全局配置文件:

# cfg.py
# Using a config file to import my globals across modules

#import queue
import multiprocessing

# q = queue.Queue()
q = multiprocessing.Queue()

主要模块:

# mod1.py

import cfg
import mod2
import multiprocessing

def testq():
global q
print("q has {} elements".format(cfg.q.qsize()))

if __name__ == '__main__':
testq()
p = multiprocessing.Process(target=mod2.add_to_q)
p.start()
p.join()
testq()
mod2.pullfromq()
testq()

辅助模块:

# mod2.py

import cfg

def add_to_q():
cfg.q.put("Hello")
cfg.q.put("World!")
print("qsize in add_to_q is {}".format(cfg.q.qsize()))


def pullfromq():
if not cfg.q.empty():
msg = cfg.q.get()
print(msg)

这是我实际得到的输出:

q has 0 elements
qsize in add_to_q is 2
q has 0 elements
q has 0 elements

与我期望得到的输出:

q has 0 elements
qsize in add_to_q is 2
q has 2 elements
Hello
q has 1 elements

到目前为止,我已经尝试使用multiprocessing.Queuequeue.Queue。我还测试了使用和不使用 Process.join() 的情况。

如果我在不使用多处理的情况下运行相同的程序,我会得到上面显示的预期输出。

我在这里做错了什么?

编辑:

Process.run() 为我提供了预期的输出,但它也会在运行时阻止主进程,这不是我想要做的。

我的理解是 Process.run() 在调用进程的上下文中运行创建的进程(在我的例子中是主进程),这意味着它与主进程调用没有什么不同相同的功能。

我仍然不明白为什么我的队列行为没有按预期工作

最佳答案

我已经发现了问题的根源,我将在这里记录下来以供将来搜索,但我仍然想知道是否有一个标准解决方案可以在模块之间创建全局队列,因此我会接受任何其他解决方案答案/评论。

当我将以下内容添加到我的 cfg.py 文件中时,我发现了问题。

print("cfg.py 正在进程 {} 中运行".format(multiprocessing.current_process()))

这给了我以下输出:

cfg.py is running in process <_MainProcess(MainProcess, started)>
cfg.py is running in process <_MainProcess(Process-1, started)>
cfg.py is running in process <_MainProcess(Process-2, started)>

看来我正在为我创建的每个进程创建单独的队列对象,这肯定可以解释为什么它们没有按预期进行交互。

This question有评论指出

a shared queue needs to originate from the master process, which is then passed to all of its subprocesses.

尽管如此,我仍然想知道是否有一种有效的方法可以在模块之间共享全局队列,而不必在方法之间传递它。

关于python - 尝试理解跨 python 模块的多处理和队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51523981/

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