社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python 2龙卷风非同步方法

ClickThisNick • 5 年前 • 1321 次点击  

我必须使用python 2进行异步调用。

我用龙卷风来完成这个任务,但是如果有更好的工具,我可以换工具。

下面的代码运行 sleep 2 && echo hi 后台异步命令

from tornado import gen
import subprocess
import time

@gen.coroutine
def longProcess():
    bashCommand = "sleep 5 && echo hi"
    process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
    output, error = process.communicate()

    yield output

futures = [longProcess() for x in range(0, 5)]

while True:
    if all(x.done() == True for x in futures):
        break
    time.sleep(1)

print('All futures resolved')

问题是 x.done() 正在回归 True 在我的bash命令完成之前的所有未来。

我怎样才能转身 process.communicate() 进入未来(只做一次关键字“嗨”),这样我就可以等待所有的期货交易完成,然后得到期货的输出。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/44034
 
1321 次点击  
文章 [ 1 ]  |  最新文章 5 年前
xyres
Reply   •   1 楼
xyres    6 年前

使用龙卷风自己的 process.Subprocess 类,它是stdlib的包装器。 subprocess.Popen .

例子:

from tornado import process

@gen.coroutine
def longProcess():
    bashCommand = "sleep 5 && echo hi"

    proc = process.Subprocess(bashCommand.split(), stdout=subprocess.PIPE)

    yield proc.wait_for_exit() # `wait_for_exit` returns a future 
                               # which you can yield. Basically, it means
                               # you can wait for the process to complete
                               # without blocking the server

    return proc.stdout.read() # return the result of the process

    # for Python 2:
    # you can't return from a generator
    # instead use this:
    # raise gen.Return(proc.stdout.read())

你不需要 while 循环。您可以将代码移到其他的协同程序中,并生成列表。 futures . 这样地:

@gen.coroutine
def main():
    futures = [longProcess() for x in range(0, 5)]

    results = yield futures # this coroutine will not move further 
                            # until every future in the list 
                            # `futures` is resolved

    for result in results:
        print(result)

    print('All futures resolved')

作为补充说明,不要使用 time.sleep . 它会阻塞整个服务器。而是使用异步等效 gen.sleep - yield gen.sleep(1)