从 3.12 开始,是否可以创建一个可以异步或非异步的方法,并像这样使用
async def maybe_async(something_that_makes_it_async=None):
...
res = await maybe_async(some_http_interface)
和
res = maybe_async()
两者均有效。
据我所知,您可以通过用
asyncio.run()
包装函数来完成此操作,但这对于调用者来说会更干净。
“据我所知,您可以通过使用 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())
Python 3.12 是 Python 编程语言的最新稳定版本,于 2023 年 10 月 15 日发布。它包括对该语言和标准库的更改。
使用Python在线编辑器3.12
开始使用 Python Online Editor 3.12 非常简单。以下是如何使用该平台的基本演练:
访问网站:在网络浏览器中转至 https://pythononlineeditor.com/python-312/。
编写您的代码:在编辑器中,您可以开始编写Python代码。它提供语法突出显示来帮助您快速发现错误。
运行您的代码:单击“运行”按钮来执行您的代码。您将在下面的控制台中看到输出。
调试:如果遇到错误,可以使用集成调试器来查找并修复它们。调试器是学习和提高编码技能的宝贵工具。