作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们可以使用这两个函数来同步运行任何异步函数:
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
吗?
最佳答案
它们有不同的目的。 async_to_sync
将可等待转换为同步可调用,asyncio.run
执行协程并返回结果。
根据documentation ,来自 async_to_sync
的可调用在子线程中工作。
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/
我们可以使用这两个函数来同步运行任何异步函数: import asyncio from asgiref.sync import async_to_sync asyncio.run(asyncio.sl
我是一名优秀的程序员,十分优秀!