gpt4 book ai didi

python - 什么时候需要为异步代码使用执行器?当我不(但应该)时会发生什么?

转载 作者:行者123 更新时间:2023-12-04 14:14:38 25 4
gpt4 key购买 nike

asyncio docs明确asyncio代码不应该直接调用阻塞代码,同时指定用async代码运行阻塞代码的方式:

Blocking (CPU-bound) code should not be called directly. For example, if a function performs a CPU-intensive calculation for 1 second, all concurrent asyncio Tasks and IO operations would be delayed by 1 second.

An executor can be used to run a task in a different thread or even in a different process to avoid blocking the OS thread with the event loop.

但是,这个描述对于什么时候应该使用执行器不是很具体。很明显,“CPU 密集型计算 1 秒”会有问题,但 0.1s 会不会有问题?还是 0.01 秒?

文档还提供了 example

def cpu_bound():
return sum(i * i for i in range(10 ** 7))

作为在执行器中运行的东西(运行不到一秒)。

(尽管他们可能将此用作使用线程与进程的示例,但它仍然是我的意思的示例——如果它是 range(10 ** 6) 我会在执行程序中运行它吗等)


this回答,据说

The majority of the standard library consists of regular, 'blocking' function and class definitions. They do their work quickly, so even though they 'block', they return in reasonable time.

...

Loads of standard library functions and methods are fast, why would you want to run str.splitlines() or urllib.parse.quote() in a separate thread when it would be much quicker to just execute the code and be done with it?

但是什么才算是“合理时间”?我什么时候可以“只执行代码并完成它”?


我的问题是:

  1. 您如何确定需要执行人?
  2. 如果您的代码“阻塞”时间过长,实际会发生什么情况?出现这种情况的迹象是什么?

最佳答案

How do you determine that an executor is needed?

这个问题并不是 asyncio 独有的。据我所知,还没有人提出一个精确的标准。

当前的做法与其他与绩效相关的决策相同:通过结合常识和分析来确定。常识会告诉您 urllib.parse.quote() 可以在事件循环线程中调用,但使用 BeautifulSoup 解析任意大小的 HTML 文档可能不行。根据经验,协程可以包含您愿意放置在经典异步系统(如 Twisted)的回调中的代码类型。

What's actually happening if your code is "blocking" too long? What are the signs that this is the case?

您会注意到延迟增加和吞吐量降低。

程序的预期延迟可能是决定何时开始使用执行器的因素。另请注意,将某些东西交给执行者有其不可忽略的开销,因此您不想对所有事情都这样做,如果您对真正快速的事情(例如代码)这样​​做,它实际上会减慢速度归结为几个字典查找)。

关于python - 什么时候需要为异步代码使用执行器?当我不(但应该)时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com