Django-async_to_sync vs asyncio.run [英] Django — async_to_sync vs asyncio.run

查看:22
本文介绍了Django-async_to_sync vs asyncio.run的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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. 根据documentationasync_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中找到详细说明。

这篇关于Django-async_to_sync vs asyncio.run的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆