Python 多处理。进程目标仅执行3次中的2次

Python 多处理。进程目标仅执行3次中的2次,python,fork,python-multiprocessing,Python,Fork,Python Multiprocessing,我正在使用多处理库来启动一个与主进程并行的进程。我在初始化时使用target参数指定要执行的函数。但函数的执行次数约为3次中的1次 在深入挖掘多处理库并使用monkey补丁程序进行调试后,我发现BaseProcess的方法\u bootstrap(Process类继承自BaseProcess),该方法应该在初始化时调用目标参数中指定的函数,调用进程的方法start()时未调用 由于我的操作系统是Ubuntu18.04,启动该进程的默认方法是fork。因此,用于启动进程的Popen位于多处理库的文

我正在使用多处理库来启动一个与主进程并行的
进程。我在初始化时使用
target
参数指定要执行的函数。但函数的执行次数约为3次中的1次

在深入挖掘多处理库并使用monkey补丁程序进行调试后,我发现
BaseProcess
的方法
\u bootstrap
Process
类继承自
BaseProcess
),该方法应该在初始化时调用目标参数中指定的函数,调用进程的方法
start()
时未调用

由于我的操作系统是Ubuntu18.04,启动该进程的默认方法是
fork
。因此,用于启动进程的Popen位于多处理库的文件
Popen_fork.py
中。在这个Popen类中,方法
\u launch
调用
os.fork()
,然后调用进程的
\u bootstrap
方法

通过一个monkey补丁,我发现应该在子进程中执行的代码根本没有执行,这就是为什么在调用方法
start()
时,初始化进程时在
target
参数中指定的函数没有执行的原因

在比我正在研究的环境更简单的环境中,不可能重现这个问题。但这里有一些代码代表我正在做的事情,我的问题是什么:

导入时间
从多处理导入进程
从multiprocessing.managers导入BaseManager
A类:
定义初始化(自我,经理):
#管理器是通过在中注册而创建的对象
#multiprocessing.managers.BaseManager,因此它是针对进程间的
#沟通
self.manager=经理
self.p=Process(target=self.Process\u方法,args=(self.manager,))
def启动(自):
self.p.start()
def过程_方法(自我、经理):
#这是3次中有2次未执行的方法
打印(“A.process\u方法)输入方法”)
c=0
尽管如此:
打印(f“(A.process_方法)发送消息:c={c}”)
经理:接待处(f“c={c}”)
时间。睡眠(5)
班级经理:
定义初始化(自):
self.msg=None
self.unread_msg=False
def on_接收(自身,消息):
self.msg=msg
self.unread_msg=True
def get_last_消息(自身):
如果self.unread\u msg:
self.unread_msg=False
返回self.msg
其他:
一无所获
如果名称=“\uuuuu main\uuuuuuuu”:
BaseManager.register(“Manager”,Manager)
bm=BaseManager()
bm.start()
manager=bm.manager()
a=a(经理)
a、 开始()
尽管如此:
msg=manager.get\u last\u msg()
如果msg不是None:
打印(msg)
每次应该执行的方法是
A.process\u method
。在本例中,它每次都执行,但在我的环境中,它不是


是否有人曾经遇到过这个问题,并且知道如何解决它?

在进一步挖掘之后,我发现flask服务器是在线程中启动的,而不是在进程中启动的。我将它改为在进程中运行,而不是在线程中运行,现在一切都按预期运行


Flask和my进程都在使用日志记录包。这可能会导致一个问题。

您能否生成一个简单的测试用例来演示这个问题?尽量把它最小化(只需要几行代码),这样你就可以把它发布到这里了。我添加了一些代码来演示这个问题。我希望这将有助于解决我不知道如何运行代码的问题。使其完整且自包含。您需要展示如何运行代码。你如何处理
A
?我看不出你的代码如何说明这个问题。代码应该做什么?您希望得到什么样的输出和行为?你得到了什么样的输出和行为?