Python 3.5 中何时使用 wait 以及其局限性
Python 3.5 中的异步主要通过 asyncio 库和 async/ 来实现等待语法。了解何时何地利用这些构造对于优化异步应用程序的性能至关重要。
使用 wait 的决定应取决于代码的性质。默认情况下,您的代码将同步运行。要引入异步,您可以使用 async def 定义函数并使用 wait 调用它们。但是,确定同步代码还是异步代码更适合手头的任务非常重要。
作为一般经验法则,在处理 I/O 操作时使用 wait 是有益的。 I/O 操作(例如网络请求或数据库调用)通常本质上是异步的,可以通过将它们委托给事件循环来显着加速。
例如,考虑以下同步代码:
download(url1) # takes 5 seconds download(url2) # takes 5 seconds # Total time: 10 seconds
使用asyncio和await,可以异步重写相同的代码,将总的执行时间减少到需要的时间更长操作:
await asyncio.gather( async_download(url1), # takes 5 seconds async_download(url2), # takes 5 seconds ) # Total time: only 5 seconds (plus minimal asyncio overhead)
还需要注意的是,如果需要,任何异步函数都可以自由地利用同步代码。但是,应避免在没有正当理由的情况下将同步代码转换为异步代码,因为它本质上不会带来任何好处。
异步代码的一个关键考虑因素是长时间运行的同步操作可能会冻结整个程序。任何超过特定阈值(例如 50 毫秒)的同步操作都可能阻止任何并发异步任务。
为了缓解此问题,您可以将此类操作外包给单独的进程并等待其结果:
executor = ProcessPoolExecutor(2) async def extract_links(url): ... # If search_in_very_big_file() is a long synchronous operation, offload it to a separate process links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)
最后,值得注意的是,I/O 绑定的同步函数可以使用 run_in_executor() 集成到异步代码中使用 ThreadPoolExecutor 来最小化与多处理相关的开销。
以上是在Python 3.5异步编程中什么时候应该使用`await`,它有什么限制?的详细内容。更多信息请关注PHP中文网其他相关文章!