Ehs*_*bar 6 python multiprocessing
我尝试在 python 上运行这段代码
import multiprocessing
manager = multiprocessing.Manager()
final_list = manager.list()
input_list_one = ['one', 'two', 'three', 'four', 'five']
input_list_two = ['six', 'seven', 'eight', 'nine', 'ten']
def worker(data):
for item in data:
final_list.append(item)
if __name__ == '__main__':
process1 = multiprocessing.Process(target=worker, args=[input_list_one])
process2 = multiprocessing.Process(target=worker, args=[input_list_two])
process1.start()
process2.start()
process1.join()
process2.join()
print(final_list)
Run Code Online (Sandbox Code Playgroud)
但发生了这个错误: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.
Run Code Online (Sandbox Code Playgroud)
Boo*_*boo 10
问题在于声明:
manager = multiprocessing.Manager()
Run Code Online (Sandbox Code Playgroud)
它通过启动服务器进程来发挥其“魔力”。if __name__ = '__main__':因此,需要将此语句与托管列表的创建一起移动到块内,现在需要将其作为附加参数传递给流程函数worker。事实上,为了提高效率,您还可以在全局范围内移动实际上不需要在块内的所有声明if __name__ = '__main__':,因为否则它们将被创建的每个新进程不必要地执行。
import multiprocessing
def worker(final_list, data):
for item in data:
final_list.append(item)
if __name__ == '__main__':
manager = multiprocessing.Manager()
final_list = manager.list()
input_list_one = ['one', 'two', 'three', 'four', 'five']
input_list_two = ['six', 'seven', 'eight', 'nine', 'ten']
process1 = multiprocessing.Process(target=worker, args=[final_list, input_list_one])
process2 = multiprocessing.Process(target=worker, args=[final_list, input_list_two])
process1.start()
process2.start()
process1.join()
process2.join()
print(final_list)
Run Code Online (Sandbox Code Playgroud)
印刷:
['six', 'seven', 'eight', 'nine', 'one', 'ten', 'two', 'three', 'four', 'five']
Run Code Online (Sandbox Code Playgroud)
让我详细说明一下我的答案:
spawn显然,您正在使用该方法创建新进程的平台上运行。这意味着要启动新进程,将创建一个新的空地址空间,并针对源运行 Python 解释器的新实例。在调用实例的目标之前Process,将首先执行源文件中全局范围内的任何语句来初始化进程,块内的任何语句除外if __name__ = '__main__':(因为__name__对于新进程,该值将不是“__main__”) 。这就是为什么您需要将创建新进程的代码放在这样的块中,即避免进入递归循环,如果未检测到这一点,则无限地创建新进程。在您的情况下,它并没有被检测到,并且您收到了您看到的错误消息。
但即使创建Manager实例没有导致创建新进程,您的程序也不会正确。在全局范围内使用该语句final_list = manager.list()意味着正在运行的程序中的所有三个进程都将访问final_list.
| 归档时间: |
|
| 查看次数: |
7583 次 |
| 最近记录: |