在开发python包时使用多处理
我正在开发一个python包,其中将使用多处理包。然而,当在windows机器上运行它时,我遇到了一个问题。演示代码如下所示 演示的结构在开发python包时使用多处理,python,multiprocessing,Python,Multiprocessing,我正在开发一个python包,其中将使用多处理包。然而,当在windows机器上运行它时,我遇到了一个问题。演示代码如下所示 演示的结构 |pkg | __init__.py | pkg_script.py |test.py pkg是包文件夹,test.py是使用包的python脚本 init.py from .pkg_script import * pkg_script.py import multiprocessing as mp def task(task_id): pr
|pkg
| __init__.py
| pkg_script.py
|test.py
pkg是包文件夹,test.py是使用包的python脚本
init.py
from .pkg_script import *
pkg_script.py
import multiprocessing as mp
def task(task_id):
print(f'task {task_id}')
def func():
p = mp.Pool(4)
p.map(task,range(4))
test.py
import pkg
pkg.func()
我收到的错误消息是:
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.
原因是,在windows计算机上,每个子进程都将从一开始就运行脚本。因此,test.py中的pkg.func()也将在每个子流程中执行。为了避免这个问题,我们可以将pkg.func()
放在下的test.py中,如果uuu name\uuuuu=='\uuuu main\uuuu'
。但是,在开发包时,我无法强制用户这样做。用户可以将pkg.func()
放在其代码中的任何位置。如果不使用的话,有什么解决方案吗
编辑1:
请不要建议将pkg.func()
放在下的test.py中,前提是
。我知道它会起作用的。我正在寻找一个解决方案,而不使用,如果
编辑2:
我是pkg
包的开发者,而不是用户。因此,我想通过修改pkg
软件包来解决这个问题,这样pkg
软件包的用户在使用pkg
时就不会受到任何限制。这是否回答了您的问题?这回答了你的问题吗。问题不在于导入的模块,而在于测试程序。你需要test.py是如果你读了我问题的最后三句话,我知道它会在if的保护下工作。这里的问题是我正在开发一个python包,我无法预测用户将把pkg.func()
放在哪里。他们可能会在Jupyter中使用它,因为在Jupyter中很少使用主函数。因此,问题是如何在不使用的情况下解决这个问题,如果uuuu name\uuuuu='\uuuuuuu main\uuuuu'
@JiaweiLu您只能控制自己的测试程序,即test.py。在使用spawn
创建新进程的平台上运行的任何人都需要知道,他们必须在'if\uuu name\uuuu=='\uuu main\uuuu':阻止或承受后果时包含任何进程创建代码。@Booboo,因为我正在开发pkg
包,我想知道是否有任何解决方案可以通过修改pkg
包来解决这个问题,而不是要求用户在if uuuuu name\uuuu=='\uuu main\uuuu'
下放置命令,这将使pkg
包更加用户友好。另外,我认为仍然有许多python用户不知道在多处理
模块后面发生了什么。如果在使用pkg
package时出错,他们会感到困惑。