如何在python 3.5.2中使用聚集

时间:2016-08-16 20:51:27

标签: python async-await

我试图了解python中的asnychron编程是如何工作的,并编写了一个小型龙卷风应用程序,它使用sleep命令执行两个asnyc循环。 如果我等待两个协程有两个等待命令,它的行为与预期一样(第一个循环,比第二个循环执行。) 如果我将两个协同程序与聚集相结合,则没有任何反应。 (没有错误,没有打印输出,webrequest永远不会完成。)

我不明白发生了什么* await gather( coros,return_exceptions = True)

from asyncio import gather
import os.path
import tornado.ioloop
from tornado.options import define, options, parse_command_line
import tornado.web
import tornado.platform.asyncio
from tornado.gen import sleep
import datetime;

define("port", default=8888, help="run on the given port", type=int)
define("debug", default=False, help="run in debug mode")

class AsyncTestHandler(tornado.web.RequestHandler):

    async def get(self):
        operation = self.get_query_argument('operation')
        if operation == 'with_two_waits':
            await self._with_two_waits()
        elif operation == 'with_gather':
            await self._with_gather()
        else:
            self.finish('use operation=with_two_waits or operation=with_gather')
            return
        self.finish('finished ' + operation);

    async def _with_two_waits(self):
        print('_with_two_waits: start' + str(datetime.datetime.now()) )
        w1 = self._wait_loop("First loop", 8)
        w2 = self._wait_loop("Second loop", 6)
        await w1
        await w2
        print('_with_two_waits: finished' + str(datetime.datetime.now()))

    async def _with_gather(self):
        print('_with_gather: start' + str(datetime.datetime.now()))
        coros = []
        coros.append(self._wait_loop("First loop", 8))
        coros.append(self._wait_loop("Second loop", 6))
        await gather(*coros, return_exceptions=True)
        print ('_with_gather: finished' + str(datetime.datetime.now()))

    async def _wait_loop(self, loop_name, count):
        for i in range(1, count + 1):
            print(loop_name + '  ' + str(i) + '/' + str(count) + '  ' + str(datetime.datetime.now()))
            await sleep(0.1)
        print(loop_name + ' complete')


def start_web_app():
    parse_command_line()
    app = tornado.web.Application(
        [
            (r"/asnycTest", AsyncTestHandler),
            ],
        debug=options.debug,
        )
    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

if __name__ == "__main__":
    start_web_app()

1 个答案:

答案 0 :(得分:0)

gather使用asyncio事件循环。如果你想将asyncio与龙卷风混合,你需要安装tornado的asyncio事件循环:

将此添加到您的导入中:

from tornado.platform.asyncio import AsyncIOMainLoop

删除它:

import tornado.platform.asyncio

在导入后立即添加此行:

AsyncIOMainLoop().install()