原因:run_until_complete和run_forever运行对比,
run_until_complete 来运行 loop ,等到 future 完成,run_until_complete 也就返回了。
run_forever 会一直运行,直到 stop 被调用(在python3.7中已经取消了)
第一种运行方式
# coding=utf-8
import asyncio
import functools
import logging
import time
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [*] %(processName)s %(threadName)s %(message)s"
)
# def done_callback (loop, futu):
# loop.stop()
async def work01 (x):
logging.info(f'Waiting :{str(x)}')
await asyncio.sleep(x)
logging.info(f'Done :{str(x)}')
# async def work02 (
# loop, # 第二种运行方式
# x
# ):
# logging.info(f'Waiting :{str(x)}')
# await asyncio.sleep(x)
# logging.info(f'Done :{str(x)}')
# loop.stop() # 第二种运行方式
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
# 第一种运行方式
loop.run_until_complete(work01(1))
loop.run_until_complete(work01(3))
# 第二种运行方式( 第二个协程没结束,loop 就停止了——被先结束的那个协程给停掉的。)
# asyncio.ensure_future(work02(loop, 1))
# asyncio.ensure_future(work02(loop, 3))
# 解决第二种运行方式的最佳方法
# futus = asyncio.gather(work02(loop, 1), work02(loop, 3))
# futus.add_done_callback(functools.partial(done_callback, loop))
# loop.run_forever()
loop.close()
logging.info(f"<程序退出> 总用时:{time.time() - start}")
输出:
2019-10-08 17:48:26,730 [*] MainProcess MainThread Waiting :1
2019-10-08 17:48:27,732 [*] MainProcess MainThread Done :1
2019-10-08 17:48:27,732 [*] MainProcess MainThread Waiting :3
2019-10-08 17:48:30,735 [*] MainProcess MainThread Done :3
2019-10-08 17:48:30,735 [*] MainProcess MainThread <程序退出> 总用时:4.005354642868042
第二种运行方式( 第二个协程没结束,loop 就停止了——被先结束的那个协程给停掉的。)
# coding=utf-8
import asyncio
import functools
import logging
import time
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [*] %(processName)s %(threadName)s %(message)s"
)
# def done_callback (loop, futu):
# loop.stop()
# async def work01 (x):
# logging.info(f'Waiting :{str(x)}')
# await asyncio.sleep(x)
# logging.info(f'Done :{str(x)}')
async def work02 (
loop, # 第二种运行方式
x
):
logging.info(f'Waiting :{str(x)}')
await asyncio.sleep(x)
logging.info(f'Done :{str(x)}')
loop.stop() # 第二种运行方式
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
# 第一种运行方式
# loop.run_until_complete(work01(1))
# loop.run_until_complete(work01(3))
# 第二种运行方式( 第二个协程没结束,loop 就停止了——被先结束的那个协程给停掉的。)
asyncio.ensure_future(work02(loop, 1))
asyncio.ensure_future(work02(loop, 3))
# 解决第二种运行方式的最佳方法
# futus = asyncio.gather(work02(loop, 1), work02(loop, 3))
# futus.add_done_callback(functools.partial(done_callback, loop))
loop.run_forever()
# loop.close()
logging.info(f"<程序退出> 总用时:{time.time() - start}")
输出:
2019-10-08 17:50:15,203 [*] MainProcess MainThread Waiting :1
2019-10-08 17:50:15,203 [*] MainProcess MainThread Waiting :3
2019-10-08 17:50:16,219 [*] MainProcess MainThread Done :1
2019-10-08 17:50:16,219 [*] MainProcess MainThread <程序退出> 总用时:1.0161614418029785
解决第二种运行方式的最佳方法
# coding=utf-8
import asyncio
import functools
import logging
import time
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [*] %(processName)s %(threadName)s %(message)s"
)
def done_callback (loop, futu):
loop.stop()
# async def work01 (x):
# logging.info(f'Waiting :{str(x)}')
# await asyncio.sleep(x)
# logging.info(f'Done :{str(x)}')
async def work02 (
loop, # 第二种运行方式
x
):
logging.info(f'Waiting :{str(x)}')
await asyncio.sleep(x)
logging.info(f'Done :{str(x)}')
# loop.stop() # 第二种运行方式
if __name__ == '__main__':
start = time.time()
loop = asyncio.get_event_loop()
# 第一种运行方式
# loop.run_until_complete(work01(1))
# loop.run_until_complete(work01(3))
# 第二种运行方式( 第二个协程没结束,loop 就停止了——被先结束的那个协程给停掉的。)
# asyncio.ensure_future(work02(loop, 1))
# asyncio.ensure_future(work02(loop, 3))
# 解决第二种运行方式的最佳方法
futus = asyncio.gather(work02(loop, 1), work02(loop, 3))
futus.add_done_callback(functools.partial(done_callback, loop))
loop.run_forever()
loop.close()
logging.info(f"<程序退出> 总用时:{time.time() - start}")
输出:
2019-10-08 17:51:08,676 [*] MainProcess MainThread Waiting :1
2019-10-08 17:51:08,676 [*] MainProcess MainThread Waiting :3
2019-10-08 17:51:09,677 [*] MainProcess MainThread Done :1
2019-10-08 17:51:11,665 [*] MainProcess MainThread Done :3
2019-10-08 17:51:11,665 [*] MainProcess MainThread <程序退出> 总用时:2.9886906147003174