gpt4 book ai didi

python - Django — async_to_sync 与 asyncio.run

转载 作者:行者123 更新时间:2023-12-01 06:39:55 28 4
gpt4 key购买 nike

我们可以使用这两个函数来同步运行任何异步函数:

import asyncio
from asgiref.sync import async_to_sync

asyncio.run(asyncio.sleep(1))
async_to_sync(asyncio.sleep)(1)

有什么区别?我们可以始终使用asyncio.run而不是async_to_sync吗?

最佳答案

差异

  1. 它们有不同的目的。 async_to_sync 将可等待转换为同步可调用,asyncio.run 执行协程并返回结果。

  2. 根据documentation ,来自 async_to_sync 的可调用在子线程中工作。

  3. async_to_sync 不会为每个线程创建事件循环,以防您位于由 sync_to_async 生成的同步代码中并在异步代码中运行。它重用了异步代码循环。我们举个例子:

import asyncio
from asgiref.sync import async_to_sync, sync_to_async

async def running(n):
return [await sync_to_async(sync)(i) for i in range(n)]

def sync(n):
# it will create a new loop for every call
return asyncio.run(from_sync(n))

async def from_sync(n):
return n

print("Result:", asyncio.run(running(3)))

此循环将运行 4 个循环:1 个循环调用 running,3 个循环调用 from_sync

如果我们在 sync 中使用 async_to_sync 而不是 asyncio.run,我们会将调用 running 的循环数减少到 1 .

要查看它,您可以包装 new_event_loop 函数:

def print_deco(fn, msg):
def inner():
res = fn()
print(msg, res)
return res
return inner
p = asyncio.get_event_loop_policy()
p.new_event_loop = print_deco(p.new_event_loop, "NEW EVENT LOOP:")

详细解释可以在这个post中找到.

关于python - Django — async_to_sync 与 asyncio.run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503825/

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