Python并行运行必须放在main函数中吗?

我想用Python的multiprocessing.Pool进行进程并行运行。
放在__name__=="__main__"里面,可以正常运行。
但作为模块导入就会报错。
在网上查了一下,必须放在main函数里面执行。
请教一下,有什么办法不放在main函数中,作为模块或者其他函数导入运行?


回答:

官网有描述:

Python并行运行必须放在main函数中吗?

同样在协程 asyncio 中有个 run_in_executor api,第一个入参是 executor,这里我们可以指定 None 或者 ThreadPoolExecutor 或者 ProcessPoolExecutor 三个参数之一;其中也提到,当传参数为 ProcessPoolExecutor 时候,协程的运行就必须要在 if __name__ == "__main__" 下,原因就是因为 ProcessPoolExecutor 背后也是使用了 multiprocessing 库。

Python并行运行必须放在main函数中吗?

stackoverflow有个答案,你可以具体看一下,https://stackoverflow.com/que...

具体说的是针对 LinuxWindows 以及 Mac 系统的进程创建方式的不同「fork和spawn」对多进程使用方式的影响。

multiprocessing 对三种操作系统的进程参考python官网文档:
https://docs.python.org/3/lib...

如果是linux系统的话好像就没这个问题 「你可以试试」,这里仅提供一些参考资料方便理解。

-------- 补充 ---------

使用 spawn 方式部分源码:

# SpawnProcess

class SpawnProcess(process.BaseProcess):

_start_method = 'spawn'

@staticmethod

def _Popen(process_obj):

from .popen_spawn_posix import Popen

return Popen(process_obj) # <- here

# Popen

class Popen(popen_fork.Popen):

method = 'spawn'

DupFd = _DupFd

def _launch(self, process_obj):

from . import resource_tracker

tracker_fd = resource_tracker.getfd()

self._fds.append(tracker_fd)

prep_data = spawn.get_preparation_data(process_obj._name) # <- here

...

# spawn.get_preparation_data

def get_preparation_data(name):

'''

Return info about parent needed by child to unpickle process object

'''

_check_not_importing_main() # <- here

# _check_not_importing_main

def _check_not_importing_main():

if getattr(process.current_process(), '_inheriting', False): # <- 这里如果不在 __name__ == '__main__' 下面,会再new一个进程出来,getattr的值会是True

raise RuntimeError('''

An attempt has been made to start a new process before the

current process has finished its bootstrapping phase.

This probably means that you are not using fork to start your

child processes and you have forgotten to use the proper idiom

in the main module:

if __name__ == '__main__':

freeze_support()

...

The "freeze_support()" line can be omitted if the program

is not going to be frozen to produce an executable.''')

所以使用 spawn 的方式的时候,会去检查这么一个是否使用main的判断,因此你必须使用 __main__

以上是 Python并行运行必须放在main函数中吗? 的全部内容, 来源链接: utcz.com/p/938754.html

回到顶部