# 1.运行异步代码而不用担心循环
"""
import asyncio
async def main():
pass
asyncio.run(main())#如果你只有一个线程和进程,并且只有一个协程需要从头到尾运行
"""
# 2.在Python3.6 清理异步生成器之后的代码
"""
import asyncio
async def main():
pass
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
try:
# 清理任何没有完全消耗的异步生成器。
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
loop.close()
"""
# 3.如果代码可能运行在线程中,需要使用下面的方式
"""
import sys
async def main():
pass
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
if sys.platform != "win32":
# 返回当前策略的当前子监视器。
watcher = asyncio.get_child_watcher()
# 给一个事件循环绑定监视器。
# 如果监视器之前已绑定另一个事件循环,那么在绑定新循环前会先解绑原来的事件循环。
watcher.attach_loop(loop)
try:
loop.run_forever()
finally:
try:
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
loop.close()
"""
# 4.判断是否只有一个事件循环
"""
import asyncio
async def main(loop):
assert loop == asyncio.get_running_loop()
print("ok")
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
"""
# 5.停止和关闭循环
"""
import asyncio
import functools
async def main(loop):
print("Print in main")
def stop_loop(fut, *, loop):
loop.call_soon_threadsafe(loop.stop)
loop = asyncio.get_event_loop()
tasks = [loop.create_task(main(loop)) for _ in range(10)]
# 为了能够正确地停止循环,我们需要确保已经消耗了所有任务,因此我们通过调用asyncio.gather来包装它们并向其add_done_callback,这将关闭我们的循环。
asyncio.gather(*tasks).add_done_callback(functools.partial(stop_loop, loop=loop))
try:
loop.run_forever()
finally:
try:
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
loop.close()
"""
# 回调函数(任务完成时,发出的提示)
"""
import time,functools
import asyncio
now = lambda : time.time()
async def do_some_work(x):
print('Waiting: ', x)
return 'Done after {}s'.format(x)
def callback(t, future):
print('Callback:', t, future.result())
start = now()
coroutine = do_some_work(2)
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(coroutine)
task.add_done_callback(functools.partial(callback, 2))
loop.run_until_complete(task)
print('TIME: ', now() - start)
import asyncio,time
from threading import Thread
now = lambda : time.time()
def start_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
def more_work(x):
print('More work {}'.format(x))
time.sleep(x)
print('Finished more work {}'.format(x))
start = now()
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()
new_loop.call_soon_threadsafe(more_work, 6)
new_loop.call_soon_threadsafe(more_work, 3)
print('TIME: {}'.format(time.time() - start))
"""
asyncio常见编程方式
最新推荐文章于 2023-02-05 17:34:44 发布