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()