代码有点多,我都注释过了,该文章仅协程部分,python官网入门教程的化请看我github:python3.9入门教程 群:970353786
代码有点多,不懂可群问我,下面是协程方面的代码demo:
"""
作者:杨涵x
时间:2021/4/30
"""
# import asyncio
# async def main():
# print('Hello ...')
# await asyncio.sleep(1)
# print('... World!')
# asyncio.run(main())
'''等待 1 秒后打印 "hello",然后 再次 等待 2 秒后打印 "world"'''
# import asyncio
# import time
#
# async def say_after(delay, what):
# await asyncio.sleep(delay)
# print(what)
# async def main():
# print(f"started at {time.strftime('%X')}")
# await say_after(1, 'hello')
# await say_after(2, 'world')
# print(f"finished at {time.strftime('%X')}")
# asyncio.run(main())
'''asyncio.create_task() 函数用来并发运行作为 asyncio 任务 的多个协程。'''
# async def main():
# task1 = asyncio.create_task(
# say_after(1, 'hello'))
# task2 = asyncio.create_task(
# say_after(2, 'world'))
# print(f"started at {time.strftime('%X')}")
# # Wait until both tasks are completed (should take
# # around 2 seconds.)
# await task1
# await task2
#
# print(f"finished at {time.strftime('%X')}")
# asyncio.run(main())
'''Python 协程属于 可等待 对象,因此可以在其他协程中被等待'''
# import asyncio
#
# async def nested():
# return 42
#
# async def main():
# # Nothing happens if we just call "nested()".
# # A coroutine object is created but not awaited,
# # so it *won't run at all*.
# # Let's do it differently now and await it:
# print(await nested()) # will print "42".
#
# asyncio.run(main())
'''
协程函数: 定义形式为 async def 的函数;
协程对象: 调用 协程函数 所返回的对象。
'''
'''当一个协程通过 asyncio.create_task() 等函数被封装为一个 任务,该协程会被自动调度执行'''
# import asyncio
#
# async def nested():
# return 42
#
# async def main():
# # Schedule nested() to run soon concurrently
# # with "main()".
# task = asyncio.create_task(nested())
#
# # "task" can now be used to cancel "nested()", or
# # can simply be awaited to wait until it is complete:
# await task
# asyncio.run(main())
'''运行 asyncio 程序'''
'''asyncio.run(coro, *, debug=False)¶'''
# import asyncio
# async def main():
# await asyncio.sleep(1)
# print('hello')
#
# asyncio.run(main())
'''创建任务'''
'''asyncio.create_task(coro, *, name=None)¶'''
# import asyncio
# async def coro():
# return 2021
# task = asyncio.create_task(coro())#python3.7+
# This works in all Python versions but is less readable
# task = asyncio.ensure_future(coro())#before python3.7
'''休眠'''
''' asyncio.sleep(delay, result=None, *, loop=None)¶'''
'''以下协程示例运行 5 秒,每秒显示一次当前日期'''
# import asyncio
# import datetime
#
# async def display_date():
# loop = asyncio.get_running_loop()
# end_time = loop.time() + 5.0
# while True:
# print(datetime.datetime.now())
# if (loop.time() + 1.0) >= end_time:
# break
# await asyncio.sleep(1)
#
# asyncio.run(display_date())
'''并发运行任务'''
''' asyncio.gather(*aws, loop=None, return_exceptions=False)¶'''
# import asyncio
#
# async def factorial(name, number):
# f = 1
# for i in range(2, number + 1):
# print(f"Task {name}: Compute factorial({i})...")
# await asyncio.sleep(1)
# f *= i
# print(f"Task {name}: factorial({number}) = {f}")
#
# async def main():
# # Schedule three calls *concurrently*:
# await asyncio.gather(
# factorial("A", 2),
# factorial("B", 3),
# factorial("C", 4),
# )
#
# asyncio.run(main())
'''屏蔽取消操作'''
'''asyncio.shield(aw, *, loop=None)保护一个 可等待对象 防止其被 取消'''
# res = await shield(something())#demo
'''如果希望完全忽略取消操作 (不推荐) 则 shield() 函数需要配合一个 try/except 代码段'''
# try:
# res = await shield(something())
# except CancelledError:
# res = None
'''超时'''
'''asyncio.wait_for(aw, timeout, *, loop=None)¶'''
# import asyncio
# async def eternity():
# # Sleep for one hour
# await asyncio.sleep(3600)
# print('yay!')
#
# async def main():
# # Wait for at most 1 second
# try:
# await asyncio.wait_for(eternity(), timeout=1.0)
# except asyncio.TimeoutError:
# print('timeout!')
#
# asyncio.run(main())
'''简单等待'''
'''syncio.wait(aws, *, loop=None, timeout=None, return_when=ALL_COMPLETED)'''
# 用法:
# import asyncio
# done, pending = await asyncio.wait(aws)
# async def foo():
# return 42
#
# task = asyncio.create_task(foo())
# done, pending = await asyncio.wait({task})
#
# if task in done:
# asyncio.run(task)
# # Everything will work as expected now.
'''在线程中运行'''
'''asyncio.to_thread(func, /, *args, **kwargs)在不同的线程中异步地运行函数 func。'''
'''这个协程函数主要是用于执行在其他情况下会阻塞事件循环的 IO 密集型函数/方法'''
# import asyncio,time
# def blocking_io():
# print(f"start blocking_io at {time.strftime('%X')}")
# # Note that time.sleep() can be replaced with any blocking
# # IO-bound operation, such as file operations.
# time.sleep(1)
# print(f"blocking_io complete at {time.strftime('%X')}")
#
# async def main():
# print(f"started main at {time.strftime('%X')}")
#
# await asyncio.gather(
# asyncio.to_thread(blocking_io),
# asyncio.sleep(1))
# print(f"finished main at {time.strftime('%X')}")
# asyncio.run(main())
''':要取消一个正在运行的 Task 对象可使用 cancel() 方法。调用此方法将使该 Task 对象抛出一个 CancelledError 异常给打包的协程'''
'''以下示例演示了协程是如何侦听取消请求的'''
# import asyncio
# async def cancel_me():
# print('cancel_me(): before sleep')
#
# try:
# # Wait for 1 hour
# await asyncio.sleep(3600)
# except asyncio.CancelledError:
# print('cancel_me(): cancel sleep')
# raise
# finally:
# print('cancel_me(): after sleep')
#
# async def main():
# # Create a "cancel_me" Task
# task = asyncio.create_task(cancel_me())
#
# # Wait for 1 second
# await asyncio.sleep(1)
#
# task.cancel()
# try:
# await task
# except asyncio.CancelledError:
# print("main(): cancel_me is cancelled now")
#
# asyncio.run(main())
'''基于生成器的协程'''
'''@asyncio.coroutine
用来标记基于生成器的协程的装饰器。
此装饰器使得旧式的基于生成器的协程能与 async/await 代码相兼容
'''
# import asyncio
# @asyncio.coroutine
# def old_style_coroutine():
# yield from asyncio.sleep(1)
#
# async def main():
# await old_style_coroutine()
'''队列能被用于多个的并发任务的工作量分配:'''
import asyncio
import random
import time
async def worker(name, queue):
while True:
# Get a "work item" out of the queue.
sleep_for = await queue.get()
# Sleep for the "sleep_for" seconds.
await asyncio.sleep(sleep_for)
# Notify the queue that the "work item" has been processed.
queue.task_done()
print(f'{name} has slept for {sleep_for:.2f} seconds')
async def main():
# Create a queue that we will use to store our "workload".
queue = asyncio.Queue()
# Generate random timings and put them into the queue.
total_sleep_time = 0
for _ in range(20):
sleep_for = random.uniform(0.05, 1.0)
total_sleep_time += sleep_for
queue.put_nowait(sleep_for)
# Create three worker tasks to process the queue concurrently.
tasks = []
for i in range(3):
task = asyncio.create_task(worker(f'worker-{i}', queue))
tasks.append(task)
# Wait until the queue is fully processed.
started_at = time.monotonic()
await queue.join()
total_slept_for = time.monotonic() - started_at
# Cancel our worker tasks.
for task in tasks:
task.cancel()
# Wait until all worker tasks are cancelled.
await asyncio.gather(*tasks, return_exceptions=True)
print('====')
print(f'3 workers slept in parallel for {total_slept_for:.2f} seconds')
print(f'total expected sleep time: {total_sleep_time:.2f} seconds')
asyncio.run(main())