我试图了解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()
答案 0 :(得分:0)
gather
使用asyncio事件循环。如果你想将asyncio与龙卷风混合,你需要安装tornado的asyncio事件循环:
将此添加到您的导入中:
from tornado.platform.asyncio import AsyncIOMainLoop
删除它:
import tornado.platform.asyncio
在导入后立即添加此行:
AsyncIOMainLoop().install()