python异步执行命令_如何从Python异步运行外部命令?

cdleary..

44

如果要并行运行多个进程,然后在产生结果时处理它们,可以使用如下所示的轮询:

from subprocess import Popen, PIPE

import time

running_procs = [

Popen(['/usr/bin/my_cmd', '-i %s' % path], stdout=PIPE, stderr=PIPE)

for path in '/tmp/file0 /tmp/file1 /tmp/file2'.split()]

while running_procs:

for proc in running_procs:

retcode = proc.poll()

if retcode is not None: # Process finished.

running_procs.remove(proc)

break

else: # No process is done, wait a bit and check again.

time.sleep(.1)

continue

# Here, `proc` has finished with return code `retcode`

if retcode != 0:

"""Error handling."""

handle_results(proc.stdout)

那里的控制流程有点复杂,因为我试图让它变小 - 你可以根据自己的喜好进行重构.:-)

这具有首先为早期完成请求提供服务的优点.如果您调用communicate第一个正在运行的进程并且结果运行时间过长,那么当您可以处理其结果时,其他正在运行的进程将处于空闲状态.

使用`['/ usr/bin/my_cmd',' - i',path]`而不是`['/ usr/bin/my_cmd',' - i%s'%path] (5认同)

@Tino这取决于你如何定义忙等待.请参阅[忙等待和轮询之间有什么区别?](http://stackoverflow.com/questions/10594426/) (3认同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值