2016-08-16 66 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()