memo

2013-10-06

Python で複数プロセスたちあげて結果を非同期で処理する その2

昨日のやつ の tornado 版。

from __future__ import print_function

from tornado import gen
from tornado.concurrent import Future
from tornado.process import Subprocess

def process(*cmdline):
    f = Future()
    p = Subprocess(cmdline, stdout=Subprocess.STREAM)

    p.stdout.read_until_close(print)
    p.set_exit_callback(f.set_result)

    return f


@gen.coroutine
def main():
    yield [
        process('sh', '-c', 'sleep 3 && echo echo3'),
        process('sh', '-c', 'sleep 2 && echo echo2'),
        process('sh', '-c', 'sleep 1 && echo echo1'),
    ]

if __name__ == '__main__':
    from tornado.ioloop import IOLoop
    IOLoop.instance().run_sync(main)

defer.gatherResults 相当が無いみたいだけど、 list of Future を yield すればいい感じにやってくれるっぽい。