import asyncio
import time
import logging
logging.basicConfig( # 用日志打印输出信息
level=logging.INFO,
format="%(asctime)s %(process)d %(thread)d [*] %(message)s"
)
async def myWorker(lock,i):
logging.info(f"试图获得锁定:{i}")
async with lock:
logging.info(f"目前已锁定:{i}")
await asyncio.sleep(3)
logging.info(f"解锁临界区:{i}")
async def main():
lock = asyncio.Lock()
await asyncio.wait([myWorker(lock,1), myWorker(lock,2), myWorker(lock,3)])
if __name__ == '__main__':
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
logging.info("所有任务完成")
except KeyboardInterrupt as e:
logging.info(asyncio.Task.all_tasks())
logging.info(asyncio.gather(*asyncio.Task.all_tasks()).cancel())
loop.stop()
loop.run_forever()
finally:
loop.close() # 在jupyter不能手动关闭
输出:
2019-11-15 13:32:54,117 11552 12816 [*] 试图获得锁定:2
2019-11-15 13:32:54,117 11552 12816 [*] 目前已锁定:2
2019-11-15 13:32:54,117 11552 12816 [*] 试图获得锁定:1
2019-11-15 13:32:54,118 11552 12816 [*] 试图获得锁定:3
2019-11-15 13:32:57,119 11552 12816 [*] 解锁临界区:2
2019-11-15 13:32:57,119 11552 12816 [*] 目前已锁定:1
2019-11-15 13:33:00,120 11552 12816 [*] 解锁临界区:1
2019-11-15 13:33:00,120 11552 12816 [*] 目前已锁定:3
2019-11-15 13:33:03,120 11552 12816 [*] 解锁临界区:3
2019-11-15 13:33:03,120 11552 12816 [*] 所有任务完成