首页 文章

如何在python 3.5.2中使用聚集

提问于
浏览
1

我试图了解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

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

    将此添加到您的导入:

    from tornado.platform.asyncio import AsyncIOMainLoop
    

    删除这个:

    import tornado.platform.asyncio
    

    并在导入后立即添加此行:

    AsyncIOMainLoop().install()
    

相关问题