所有
我已经阅读了几个关于如何在python中运行子进程的线程,但它们似乎都没有帮助我。这可能是因为我不知道如何正确使用它们。我有几个方法可以同时运行而不是按顺序运行,我认为子进程模块会为我做这个。
def services():
services = [method1(),
method2(),
method3(),
mrthod4(),
method5()]
return services
def runAll():
import subprocess
for i in services():
proc = subprocess.call(i,shell=True)
这种方法的问题是method1()启动,而method2()直到1完成才开始。我尝试了几种方法,包括在我的服务方法中使用subprocess.Popen []而没有运气。任何人都可以帮我解决如何让方法1-5同时运行的问题吗?
谢谢, 亚当
答案 0 :(得分:4)
根据Python文档subprocess.call()
等待命令完成。您应该直接使用subprocess.Popen
对象,这将为您提供所需的灵活性。
答案 1 :(得分:1)
你需要使用&以异步方式执行它们。这是一个例子:
subprocess.call("./foo1&", shell=True)
subprocess.call("./foo2&", shell=True)
这就像普通的unix shell一样。
编辑:虽然有多种更好的方法可以做到这一点。请参阅其他答案以获取一些示例。
答案 2 :(得分:1)
Python线程更适合您所寻找的内容:http://docs.python.org/library/threading.html甚至是多处理模块:http://docs.python.org/library/multiprocessing.html#module-multiprocessing。
答案 3 :(得分:1)
通过说method1()
,你正在调用该函数并等待它返回。 (这是一种功能,而不是一种方法。)
如果您只想并行运行一堆重型功能并收集结果,可以使用joblib
:
from joblib import Parallel, delayed
functions = [fn1, fn2, fn3, fn4]
results = Parallel(n_jobs=4)(delayed(f)() for f in functions)
答案 4 :(得分:1)
subprocess.call()
阻止,直到流程完成。
multiprocessing
听起来更适合你正在做的事情。
例如:
from multiprocessing import Process
def f1():
while True:
print 'foo'
def f2():
while True:
print 'bar'
def f3():
while True:
print 'baz'
if __name__ == '__main__':
for func in (f1, f2, f3):
Process(target=func).start()
答案 5 :(得分:1)
在python 3.2.x中,并发期货模块使这类事情变得非常简单。
答案 6 :(得分:0)
子进程不会使进程异步。您尝试实现的目标可以使用多线程或多处理模块来完成。
答案 7 :(得分:0)
我最近遇到了类似的问题,并解决了这个问题:
from multiprocessing import Pool
def parallelfuncs(funcs, args, results, bad_value = None):
p = Pool()
waiters = []
for f in funcs:
waiters.append(p.apply_async(f, args, callback = results.append))
p.close()
for w in waiters:
if w.get()[0] == bad_value:
p.terminate()
return p
好处是函数 funcs 在args(地图的反面)上并行执行,并返回结果。多处理池使用所有处理器并处理作业执行。
w.get blocks,如果不清楚的话。
对于您的用例,您可以致电
results = []
parallelfuncs(services, args, results).join()
print results