Python p、 start()阻塞循环的其余部分

Python p、 start()阻塞循环的其余部分,python,multiprocessing,Python,Multiprocessing,我试图同时从多个模块运行多个main()函数。 我第一次尝试使用线程,但在父进程被很好地终止时,我找不到终止进程的方法。所以我转到了多处理模块。 但是由于某些原因,p.start()被阻塞,循环中只有3个模块中的第一个模块启动 import os import signal import sys from multiprocessing import Process jobs = [] for root, dirs, files in os.walk('modules'): f

我试图同时从多个模块运行多个main()函数。 我第一次尝试使用线程,但在父进程被很好地终止时,我找不到终止进程的方法。所以我转到了多处理模块。 但是由于某些原因,p.start()被阻塞,循环中只有3个模块中的第一个模块启动

import os
import signal
import sys
from multiprocessing import Process

jobs = []
for root, dirs, files in os.walk('modules'):
        for dir in dirs:
                print dir
                module = getattr(__import__("modules." + dir), dir)
                func = getattr(module, "main", None)
                if func:
                        p = Process(target=func)
                        jobs.append(p)
                        p.start()
                dirs[:] = []  # don't recurse into directories.

print jobs
输出为:

limitlessLED
[<Process(Process-1, started)>]
Connected to MQTT
limitlesled
[]
已连接到MQTT

您正在销毁
dirs
的内容,同时对其进行迭代:

   for dir in dirs:
            ...
            dirs[:] = []  # don't recurse into directories.
这就是为什么只在循环中循环一次:在循环的第一次迭代结束时清空
dirs
。或者你发布的代码中的缩进错误了。很难从这里猜出是哪个;-)

编辑:更多

好的,看起来您是从中复制了代码的要点。您没有正确复制缩进:您将
dirs[:]=[]
行缩进了一个级别太多。

它作为答案而不是注释发布,以利用注释不可用的格式功能

我试图同时从多个模块运行多个main()函数

您可以使用
子流程
模块,将所有
模块
'子目录作为Python包并行执行:

import sys
from glob import glob
from subprocess import Popen

processes = [Popen([sys.executable or 'python', '-m', dirname.replace('/', '.')])
             for dirname in glob('modules/*/')]
Popen
不会阻止您的程序,因此所有进程都会同时运行。而
Popen
具有
.terminate()
.kill()
方法,您可以随时调用这些方法来停止子进程

它希望包是可执行的,即有:


哈所以我做了。仍然习惯于缩进影响程序流。感谢不要使用递归遍历
模块
目录的
os.walk
。您的代码:
\uuuuuuuuuuuuuuuuuuuu导入(“模块”+dir)
无论如何都不会处理它。改用
os.listdir(“模块”)
from . import main

main()