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