根据参数值使函数同步或异步

问题描述 投票:0回答:2

从 3.12 开始,是否可以创建一个可以异步或非异步的方法,并像这样使用

async def maybe_async(something_that_makes_it_async=None):
    ...

res = await maybe_async(some_http_interface)

res = maybe_async()

两者均有效。

据我所知,您可以通过用

asyncio.run()
包装函数来完成此操作,但这对于调用者来说会更干净。

python asynchronous python-3.12
2个回答
0
投票

据我所知,您可以通过使用 asyncio.run() 包装函数来完成此操作,但这对于调用者来说会更干净。

不,你不能那样做。来自 Asyncio 的文档

当另一个异步事件循环正在运行时,无法调用此函数 在同一个线程中运行。

...

如果loop_factory不为None,则用于创建新的事件循环; >否则使用 asyncio.new_event_loop() 。

asyncio.run()
将为您创建一个新的事件循环。

针对您的情况的一种解决方案是 Django 提供的。这并不完全是您所要求的,但它使您能够通过

await
来运行普通函数或异步函数。

这里我写了一个非常简单的版本:

import asyncio
from inspect import isawaitable

async def sync_to_async(fn):
    res = fn()
    if isawaitable(res):
        return await res
    return res

def normal_function():
    return 10

async def async_function():
    return 10

async def main():
    res1 = await sync_to_async(normal_function)
    res2 = await sync_to_async(async_function)
    print(res1, res2)

asyncio.run(main())

-4
投票

Python 3.12 是 Python 编程语言的最新稳定版本,于 2023 年 10 月 15 日发布。它包括对该语言和标准库的更改。

使用Python在线编辑器3.12

开始使用 Python Online Editor 3.12 非常简单。以下是如何使用该平台的基本演练:

访问网站:在网络浏览器中转至 https://pythononlineeditor.com/python-312/

编写您的代码:在编辑器中,您可以开始编写Python代码。它提供语法突出显示来帮助您快速发现错误。

运行您的代码:单击“运行”按钮来执行您的代码。您将在下面的控制台中看到输出。

调试:如果遇到错误,可以使用集成调试器来查找并修复它们。调试器是学习和提高编码技能的宝贵工具。

© www.soinside.com 2019 - 2024. All rights reserved.