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

2024-05-14 07:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我看到的问题是,我无法跨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.join()的情况。你知道吗

如果我不使用multiprocessing运行同一个程序,就会得到上面所示的预期输出。你知道吗

我做错什么了?你知道吗

编辑:

Process.run()给出了预期的输出,但它也会在主进程运行时阻塞它,这不是我想要做的。你知道吗

我的理解是Process.run()在调用进程(在我的例子中是主进程)的上下文中运行创建的进程,这意味着它与调用相同函数的主进程没有区别。你知道吗

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


Tags: 模块toimportadd队列queue进程elements
1条回答
网友
1楼 · 发布于 2024-05-14 07:27:31

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

当我把以下内容添加到我的cfg.py公司文件。你知道吗

print("cfg.py is running in process {}".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.

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

相关问题 更多 >

    热门问题