在开发python包时使用多处理

在开发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

我正在开发一个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):
    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时出错,他们会感到困惑。