2016-08-16 69 views
1

我试着学习如何在Python中使用asnychron编程,并编写了一个小型龙卷风应用程序,它执行两个带睡眠命令的asnyc循环。 如果我用两个await命令等待两个协程,它的行为与预期相同(第一个循环,比第二个循环执行的要快)。 如果我将两个协程与gather组合,则不会发生任何事情。 (没有错误,没有打印输出时,WebRequest的是永远不会结束。)如何在Python中使用聚集3.5.2

我不明白什么是与*发生伺机收集(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() 

回答

0

gather用途asyncio事件循环。如果你想与龙卷风混合ASYNCIO,您需要安装龙卷风ASYNCIO事件循环:

添加到您的进口:

from tornado.platform.asyncio import AsyncIOMainLoop 

删除此:

import tornado.platform.asyncio 

而且加入这行权进口后:

AsyncIOMainLoop().install()