Python 在PyDev中运行时,对multiprocessing.Process.start()的单个调用会在Windows中生成100个进程
我试图开发一个使用PyDev中的多处理模块的组件,但是遇到了一些问题,运行代码会在操作系统中产生100个python进程,并杀死我的机器。我让我的代码调用Python 在PyDev中运行时,对multiprocessing.Process.start()的单个调用会在Windows中生成100个进程,python,multiprocessing,pydev,Python,Multiprocessing,Pydev,我试图开发一个使用PyDev中的多处理模块的组件,但是遇到了一些问题,运行代码会在操作系统中产生100个python进程,并杀死我的机器。我让我的代码调用run()而不是start(),它工作得很好(当然,它是单线程的,因为start()实际上是生成进程的过程),所以这向我表明,我的代码至少没有做任何疯狂的事情,比如无限生成进程或其他什么。此外,我还编写了一个小测试代码,看看发生了什么: from multiprocessing import Process import time def c
run()
而不是start()
,它工作得很好(当然,它是单线程的,因为start()
实际上是生成进程的过程),所以这向我表明,我的代码至少没有做任何疯狂的事情,比如无限生成进程或其他什么。此外,我还编写了一个小测试代码,看看发生了什么:
from multiprocessing import Process
import time
def create_processes(num_processes, method, *args):
processes = []
for i in range(num_processes):
processes.append(Process(target=method, args=args))
return processes
def start_all(processes, stagger):
for process in processes:
process.start()
if stagger:
time.sleep(stagger)
processes = create_processes(2, time.sleep, 4)
start_all(processes, 0)
当我在cli中运行它时,它工作正常;它产生2个新进程,在超时后结束。然而,当我在PyDev中运行它时,它会生成大约600个进程(或者至少是在我的机器没有响应之前任务管理器显示的数量)。我做了一点调试,似乎在Process.start()
行self.\u popen=popen(self)
中出错了
我四处搜索了一下,但找不到任何相关的东西。CLI是否会自动
join()
将所有start()
ed进程绑定到某个单独的管理器以保持控制?我的代码中是否需要一个线程来join()
连接所有进程?PyDev是否在尝试维护日志记录和控制?是否发生了其他事情?如果这是代码的起点,则应在最后两行中加上如果uuuu name\uuuu=='\uuu main\uuuu'
,以防止子流程启动自己的子流程:
if __name__ == '__main__':
processes = create_processes(2, time.sleep, 4)
start_all(processes, 0)
如果这是代码的起点,则应在最后两行中加上
If u u name__=='_u main__;'
,以防止子流程启动自己的子流程:
if __name__ == '__main__':
processes = create_processes(2, time.sleep, 4)
start_all(processes, 0)
哦,我想我明白了。那么您的意思是,当我从文件运行时,当派生的进程导入模块以获取它试图调用的方法时,它正在重新执行进程创建代码?但是,生成的子模块如何看待它们的
\uuuuuu name\uuuuuu
“在一个模块中,模块的名称(作为字符串)作为全局变量\uuuuu name\uuuuuuu
的值可用”,因此,如果您的模块名为fido.py,\uuuuuuuu name\uuuuuu
将只是'fido'
。只有当您以脚本的形式执行模块时,\uuuuu name\uuuuuuu
才被设置为'\uuuuu main\uuuuu'
。哦。现在这显然很有道理。真不敢相信我的头撞了这么久。。。。谢谢。哦,我想我明白了。那么您的意思是,当我从文件运行时,当派生的进程导入模块以获取它试图调用的方法时,它正在重新执行进程创建代码?但是,生成的子模块如何看待它们的\uuuuuu name\uuuuuu
“在一个模块中,模块的名称(作为字符串)作为全局变量\uuuuu name\uuuuuuu
的值可用”,因此,如果您的模块名为fido.py,\uuuuuuuu name\uuuuuu
将只是'fido'
。只有当您以脚本的形式执行模块时,\uuuuu name\uuuuuuu
才被设置为'\uuuuu main\uuuuu'
。哦。现在这显然很有道理。真不敢相信我的头撞了这么久。。。。谢谢