Python:Multiprocessing.Process 有时不调用目标函数

问题描述 投票:0回答:2

我有一个每天运行的脚本,在调用进程时,在 100 多个进程中,有时随机有 2 或 3 个进程没有启动,并且我的目标函数没有被调用。这种情况最近才开始发生,几天前它运行良好。它的跳过过程也没有模式,它发生在随机的日子,并且随机没有过程失败。我的实现如下:

class Worker:
    def __init__(self, count, file):
        self.file = file
        self.count = count
    def invoker(a):
        print("Process [self.count] invoker called")

for i in range(5):
    worker = Worker(i, file).  # Different worker obj for every different process
    process = multiprocessing.Process(target=worker.invoker, args=(a, ))
    proc_list.append(process)
    proc_list[-1].start()
[proc.join() for proc in proc_list]

在所有成功的日子里,我都能看到以下日志: 调用了进程 16 调用者。 调用了进程 37 调用者。 调用了进程 9 调用者。 ... 调用了进程 100 个调用者, 以不同的顺序拥有从 1 到 100 的所有值。但 但有时,除了“调用了 Process 9 调用者”之外,所有值都在那里。我的调用者没有做任何事情。

在代码级别上,在我看来一切都很好,但操作系统不允许进程生成。有什么我遗漏或可以检查的吗?请帮忙,谢谢!

我尝试在调用程序函数中添加日志,并在流程开始之前和之后添加流程级别详细信息。

python multiprocessing python-multiprocessing multiprocess
2个回答
2
投票

首先,你并没有真正检查发生了什么。加入所有进程后,您应该检查它们的

exitcode
以确保它们都正确执行。检查进程的退出状态以确保一切顺利运行始终是一个好习惯。

其次,您声称您正在启动一百多个进程,并且您提供的示例代码表明您正在同时启动它们。最有可能发生的情况是,您的操作系统无法启动如此多的进程,并且在运行您的功能之前,其中很少会失败(很可能是由于 OOM)。因此你看不到它被执行。


0
投票

我也有同样的问题。我尽可能多地记录我的代码,但找不到任何解释这种现象的东西。我确实认为这与操作系统有关(在我的例子中是 Linux - Ubuntu),正如 @noxdafox 提到的。

我在启动(

.start()
)进程或线程之前使用了这段代码,现在我不再运行任何问题。可能是因为操作系统有时间单独启动每个进程,而不会干扰启动另一个进程。

from numpy.random import default_rng
from time import sleep
rng = default_rng()
# generates a scalar [single] value greater than or equal to 1
# but less than 3
time_to_sleep = rng.uniform(0, 3)
sleep(time_to_sleep)

# Start process or thread
proc_list.start()

代码参考:https://stackoverflow.com/a/72267613/7513730

© www.soinside.com 2019 - 2024. All rights reserved.