在Python中使用多处理填充多个列表
我正在尝试提高一个函数填充多个列表的速度,这需要+150秒的时间。我设法通过多处理使它更快,时间缩短到+20秒,但我遇到了两个问题: 1-如何“停止”和“防止”多处理运行脚本的其余部分? 2-是否有更快的方法(多线程、异步IO…) 期望输出:在Python中使用多处理填充多个列表,python,windows,list,for-loop,multiprocessing,Python,Windows,List,For Loop,Multiprocessing,我正在尝试提高一个函数填充多个列表的速度,这需要+150秒的时间。我设法通过多处理使它更快,时间缩短到+20秒,但我遇到了两个问题: 1-如何“停止”和“防止”多处理运行脚本的其余部分? 2-是否有更快的方法(多线程、异步IO…) 期望输出: Listing Popups... 808 Hello 当OP发布带有regex标记的问题时,他们应该指定他们使用的语言,因为不同的编程语言支持不同的正则表达式功能。类似地,它被认为是一个要求,当OP发布一个标有multiprocessing的问题时,他
Listing Popups...
808
Hello
当OP发布带有
regex
标记的问题时,他们应该指定他们使用的语言,因为不同的编程语言支持不同的正则表达式功能。类似地,它被认为是一个要求,当OP发布一个标有multiprocessing
的问题时,他们应该指定他们在哪个平台下运行,因为在Linux和Windows下,默认情况下,多处理的实现方式完全不同。但很明显,您是在Windows下运行的,因为您的代码表现出症状
Windows基本上使用spawn
方法来创建新进程,而Linux/Unix默认使用fork
方法。当一个新进程被“分叉”时,它将继承与父进程处于相同状态的所有变量,并从“分叉”点继续执行。当一个新进程被“繁殖”时,没有任何东西被继承;创建新的地址空间,加载新的Python解释器,并从顶部重新启动程序。因此,在全局范围内声明的所有内容都将被重新执行(这就是为什么有必要将创建新进程的代码放在中,如果uuuu name\uuuuuu=='\uuuuuu main\uuuu':
块中,以避免进入无限递归循环)。这就是为什么您的print(“Hello”)
被反复执行的原因——您创建的每个新进程都将执行该语句,因为它是全局范围的。print(“Hello”)
必须缩进到下,如果您不希望它在子进程中运行,则必须缩进到下。
Listing Popups...
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
808
Hello
[Finished in 19.892s]
Listing Popups...
808
Hello