gpt4 book ai didi

python - 何时使用,何时不使用 Python 3.5 `await` ?

转载 作者:IT老高 更新时间:2023-10-28 21:06:17 24 4
gpt4 key购买 nike

我正在了解在 Python 3.5 中使用 asyncio 的流程,但我还没有看到关于我应该 await 哪些事情以及我不应该做哪些事情的描述是或在哪里可以忽略不计。我是否只需要根据“这是一个 IO 操作,因此应该 awaited”使用我的最佳判断?

最佳答案

默认情况下,您的所有代码都是同步的。您可以使用 async def 使其异步定义函数并使用 await “调用”这些函数。一个更正确的问题是“我什么时候应该编写异步代码而不是同步代码?”。答案是“什么时候可以从中受益”。在您使用 I/O 操作的情况下,您通常会受益:

# Synchronous way:
download(url1) # takes 5 sec.
download(url2) # takes 5 sec.
# Total time: 10 sec.

# Asynchronous way:
await asyncio.gather(
async_download(url1), # takes 5 sec.
async_download(url2) # takes 5 sec.
)
# Total time: only 5 sec. (+ little overhead for using asyncio)

当然,如果你创建了一个使用异步代码的函数,这个函数也应该是异步的(应该定义为async def)。但是任何异步函数都可以自由使用同步代码。无缘无故将同步代码转换为异步是没有意义的:

# extract_links(url) should be async because it uses async func async_download() inside
async def extract_links(url):

# async_download() was created async to get benefit of I/O
html = await async_download(url)

# parse() doesn't work with I/O, there's no sense to make it async
links = parse(html)

return links

一件非常重要的事情是,任何长时间的同步操作(例如 > 50 毫秒,很难准确地说)都会卡住您在这段时间内的所有异步操作:

async def extract_links(url):
data = await download(url)
links = parse(data)
# if search_in_very_big_file() takes much time to process,
# all your running async funcs (somewhere else in code) will be frozen
# you need to avoid this situation
links_found = search_in_very_big_file(links)

您可以避免它在单独的进程中调用长时间运行的同步函数(并等待结果):

executor = ProcessPoolExecutor(2)

async def extract_links(url):
data = await download(url)
links = parse(data)
# Now your main process can handle another async functions while separate process running
links_found = await loop.run_in_executor(executor, search_in_very_big_file, links)

再举一个例子:当你需要在 asyncio 中使用 requests 时。 requests.get 只是同步长时间运行的函数,你不应该在异步代码中调用它(再次,以避免卡住)。但它运行时间长是因为 I/O,而不是因为计算时间长。在这种情况下,您可以使用 ThreadPoolExecutor 而不是 ProcessPoolExecutor 来避免一些多处理开销:

executor = ThreadPoolExecutor(2)

async def download(url):
response = await loop.run_in_executor(executor, requests.get, url)
return response.text

关于python - 何时使用,何时不使用 Python 3.5 `await` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33357233/

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