使用asyncio进行开发 异步编程与经典的“顺序”编程不同. 本页列出了常见的错误和陷阱,并解释了如何避免它们. 调试模式 默认情况下,asyncio在生产模式下运行。为了简化开发,asyncio有debug mode. 有几种方法可以启用asyncio调试模式: 将PYTHONASYNCIODEBUG环境变量设置为1. 使用-X dev Python命令行选项. Passing debug=True到asyncio.run(). 调用loop.set_debug(). 除了启用调试模式外,还要考虑: 将 asyncio logger 的日志级别设置为logging.DEBUG,例如,可以在

平台支持 asyncio模块设计为可移植的,但是某些平台在平台的底层架构和功能方面存在细微差别和局限性. 所有平台 loop.add_reader()和loop.add_writer()不能用于监视文件I / O. Windows Windows上的所有事件循环都不支持以下方法: loop.create_unix_connection()和loop.create_unix_server()不受支持.socket.AF_UNIXsocket系列是Unix特有的. loop.add_signal_handler()和loop.remove_signal_handler()不支持. Selector

策略 事件循环策略是一个全局的每个进程对象,用于控制事件循环的管理。每个事件循环都有一个defaultpolicy,可以使用策略API进行更改和自定义. 策略定义了context的概念,并管理每个上下文的单独事件循环。默认策略定义context为当前线程. 使用自定义事件循环策略,get_event_loop(), set_event_loop()和new_event_loop()函数的行为可以自定义. 策略对象应该实现AbstractEventLoopPolicy抽象基类中定义的API. 获取和设置策略 以下函数可用于获取并设置当前进程的策略: asyncio.get_event_loop_

期货 Future对象用于桥接基于低级回调的代码与高级异步/等待代码. 未来函数 asyncio.isfuture(obj) 返回True如果obj是: 的一个实例asyncio.Future, 的一个实例asyncio.Task, 一个带有_asyncio_future_blocking属性。 版本3.5中的新功能 asyncio.ensure_future(obj, *, loop=None) 返回: obj论证,如果obj是Future,一个 Task,或类似Future的对象(isfuture()用于测试。) Task对象包装obj,如果obj是acoroutine(iscorouti

事件循环 前言 事件循环是每个asyncio应用程序的核心。事件循环运行异步任务和回调,执行networkIO操作,并运行子进程. 应用程序开发人员通常应该使用高级asyncio函数,例如asyncio.run(),并且很少需要引用loopobject或调用其方法。本节主要面向低级代码,库和框架的作者,他们需要更好地控制事件循环行为. 获取事件循环 以下低级函数可用于获取,设置或创建事件循环: asyncio.get_running_loop() 返回当前操作系统线程中的运行事件循环 如果没有运行事件循环,则会引发RuntimeError。此函数只能从协程或回调调用. 新版本3.7. asyn

例外 exception asyncio.TimeoutError 手术已超过规定的截止日期. 重要 这个例外与内置的不同TimeoutError例外。 exception asyncio.CancelledError 操作已被取消. 可以捕获此异常,以便在取消asyncio任务时执行自定义操作。几乎在所有情况下都必须重新考虑例外情况. 重要事项 这个例外是Exception,所以它可以被过宽的 @try..except块: try: await operationexcept Exception: # The cancellation is broken because the *excep

队列 asyncio队列的设计类似于queue模块的类。尽管asyncio队列不是线程安全的,但它们被设计为专门用于异步/等待代码. 请注意,asyncio队列的方法没有timeout参数;使用asyncio.wait_for()使用atimeout. 另见下面的示例部分. 队列 class asyncio.Queue(maxsize=0, *, loop=None) 先进先出(FIFO)队列 如果maxsize小于或等于零,队列大小是无限的。如果是大于的整数0, 然后await put()当队列达到maxsize直到一个项被get(). 删除不同于标准库线程queue,队列的大小总是已知的,

子进程 本节介绍高级异步/等待asyncio API创建和管理子进程. 这是一个asyncio如何运行shell命令并获得结果的示例: import asyncioasync def run(cmd): proc = await asyncio.create_subprocess_shell( cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) stdout, stderr = await proc.communicate() print(f”[{cmd!r} exited with {proc.return

同步原语 asyncio同步原语设计与threading模块类似,有两个重要注意事项: asyncio原语不是线程安全的,因此它们不应该用于OS线程同步(使用threading forthat); 这些同步原语的方法不接受timeout参数;使用asyncio.wait_for()函数进行超时操作. asyncio具有以下基本同步原语: Lock Event Condition Semaphore BoundedSemaphore 锁定 class asyncio.Lock(*, loop=None) 为asyncio任务实现互斥锁。不是thread-safe. 可以使用asyncio loc

流 Streams是高级异步/等待就绪原语,用于处理网络连接。Streams允许发送和接收数据而不使用回调或低级协议和传输. 以下是使用asynciostreams编写的TCP echo客户端示例: import asyncioasync def tcp_echo_client(message): reader, writer = await asyncio.open_connection( “127.0.0.1”, 8888) print(f”Send: {message!r}”) writer.write(message.encode()) data = await reader.read