Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyDev中运行时,对multiprocessing.Process.start()的单个调用会在Windows中生成100个进程_Python_Multiprocessing_Pydev - Fatal编程技术网

Python 在PyDev中运行时,对multiprocessing.Process.start()的单个调用会在Windows中生成100个进程

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

我试图开发一个使用PyDev中的多处理模块的组件,但是遇到了一些问题,运行代码会在操作系统中产生100个python进程,并杀死我的机器。我让我的代码调用
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'
。哦。现在这显然很有道理。真不敢相信我的头撞了这么久。。。。谢谢