Python 缓慢的未来。ProcessPoolExecutor:如何改进?

Python 缓慢的未来。ProcessPoolExecutor:如何改进?,python,multiprocessing,Python,Multiprocessing,我试图理解为什么下面的代码这么慢: 导入线程 导入时间 进口期货 从日期时间导入日期时间 def转储(txt): 打印(f'[{datetime.now()}]({threading.get_ident():05}){txt}\n',end='') def sleep_ux(ux): 转储('开始') 睡眠时间(0.1) 转储(“停止”) def干管(n=10,过程=10): dump('before with') 以concurrent.futures.ProcessPoolExecutor(

我试图理解为什么下面的代码这么慢:

导入线程
导入时间
进口期货
从日期时间导入日期时间
def转储(txt):
打印(f'[{datetime.now()}]({threading.get_ident():05}){txt}\n',end='')
def sleep_ux(ux):
转储('开始')
睡眠时间(0.1)
转储(“停止”)
def干管(n=10,过程=10):
dump('before with')
以concurrent.futures.ProcessPoolExecutor(进程)作为池:
转储('映射之前')
tmp=list(pool.map(sleep,range(n)))
转储('映射后')
dump('after with')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
结果是:

[2020-10-17 23:34:12.822813] (07100) before with
[2020-10-17 23:34:12.824808] (07100) before map
[2020-10-17 23:34:21.409045] (14100) Start
[2020-10-17 23:34:21.414031] (15408) Start
[2020-10-17 23:34:21.414031] (20292) Start
[2020-10-17 23:34:21.415029] (18972) Start
[2020-10-17 23:34:21.416026] (13660) Start
[2020-10-17 23:34:21.416026] (10904) Start
[2020-10-17 23:34:21.417023] (18828) Start
[2020-10-17 23:34:21.418021] (18616) Start
[2020-10-17 23:34:21.504788] (01776) Start
[2020-10-17 23:34:21.509775] (14100) Stop
[2020-10-17 23:34:21.509775] (14100) Start
[2020-10-17 23:34:21.514761] (20292) Stop
[2020-10-17 23:34:21.514761] (15408) Stop
[2020-10-17 23:34:21.515760] (18972) Stop
[2020-10-17 23:34:21.516757] (13660) Stop
[2020-10-17 23:34:21.516757] (10904) Stop
[2020-10-17 23:34:21.517754] (18828) Stop
[2020-10-17 23:34:21.518751] (18616) Stop
[2020-10-17 23:34:21.605519] (01776) Stop
[2020-10-17 23:34:21.610506] (14100) Stop
[2020-10-17 23:34:21.611503] (07100) after map
[2020-10-17 23:34:23.281562] (07100) after with
我想理解的是,为什么启动第一个过程需要将近9秒。为什么清理它们需要将近2秒钟

这是一个windows系统(正在调试中)。 当我正常运行它时,需要+-0.5秒的时间来启动和关闭

与同一系统上的Debian WSL相比:0.04秒加速,0.006秒减速

这是正常的行为吗?和/或如何改进?为什么会发生这种情况


谢谢

Windows没有与复制进程的
fork
系统调用相同的功能。这意味着在Windows中使用具有10个工作进程的多处理池将创建10个新的python进程


启动第一个进程不需要9秒,启动池中的所有10个进程需要9秒,然后向第一个进程启动目标函数。

在Linux和其他类似Unix的操作系统上,进程是通过
fork
系统调用创建的,这基本上创建了一个延迟拷贝(写时拷贝)主要流程的一部分。这是一个快速的操作

Windows没有
fork
功能,因此必须通过启动一个新的解释器并执行完整的Python代码来创建每个工作进程(除了受保护的
if uuuuuuuu name uuuuuuuu=='uuuuu main uuuuu':
末尾的部分),以设置进程,然后才能使用它。Python在中调用这个“spawn”方法


由于Python3.8的spawn方法也是MacOS上的默认方法。

在非Windows上,进程是用“fork”创建的,它基本上创建了主进程的惰性副本(写时复制)。这很快,而Windows必须通过启动一个新的解释器并执行完整的Python代码(除了最后的受保护的主要部分)来创建进程来设置进程。您能将此注释作为一个答案吗?因为你的答案是第一个,提供的信息比詹姆斯的略多(我不知道)。