Python Multiprocessing on Windows
因为众所周知的GIL(全局解释器锁),在Python上实现真正的并发只能通过python multiprocessing。但是在Windows上,运用python multiprocessing并没有在Linux那么简单。
if __name__ == "__main__":
也许大家有些在Linux跑的很好的多进程的程序,在Windows上一跑就会经常遇到这些错误的信息
“An attempt has been made to start a new process before the current process has finished its bootstrapping phase”
根本原因在与Windows的进程启动的方式和Linux是不一样的。
Windows的进程启动方式是Spawn,Linux的缺省的启动方式是Fork。简单的说,Fork会复制父进程的所用东西,而Spawn不会。对于Python而言,Spawn会在进程中生成一个新的Python解释器,并重新加载各个module.
start method | fork | spawn |
---|---|---|
进程启动时 Import module | NO | YES |
变量的ID与父进程保持一致 | YES | NO |
子进程能得到在 if name == “main” block |
Python Multiprocessing on Windows
因为众所周知的GIL(全局解释器锁),在Python上实现真正的并发只能通过python multiprocessing。但是在Windows上,运用python multiprocessing并没有在Linux那么简单。
if __name__ == "__main__":
也许大家有些在Linux跑的很好的多进程的程序,在Windows上一跑就会经常遇到这些错误的信息
“An attempt has been made to start a new process before the current process has finished its bootstrapping phase”
根本原因在与Windows的进程启动的方式和Linux是不一样的。
Windows的进程启动方式是Spawn,Linux的缺省的启动方式是Fork。简单的说,Fork会复制父进程的所用东西,而Spawn不会。对于Python而言,Spawn会在进程中生成一个新的Python解释器,并重新加载各个module.
start method | fork | spawn |
---|---|---|
进程启动时 Import module | NO | YES |
变量的ID与父进程保持一致 | YES | NO |
子进程能得到在 if name == “main” block |