【发布时间】:2021-12-09 04:02:28
【问题描述】:
我正在创建一个带有__init__ 函数和另一个函数的python 类,比如说f。 __init__ 函数不是异步的,但另一个函数是。现在,我正在尝试从__init__ 执行另一个函数。
我研究过的东西:
- 我找到了一些带有 get_event_loop/get_running_loop 和 run_until_complete 的代码,但这会给出一个 RuntimeError,表明事件循环已经在运行。
- 我看过关于nest_asyncio的cmets,但是好像有点脏。
- 此外,我使用 create_task、gather 和 wait 尝试了几件事。但在这种情况下,代码不会等到任务完全执行。
- 我可以先调用构造函数,然后使用 await 调用第二个函数来拆分它,但我希望在构造函数期间调用第二个函数。
请注意,这是在 Azure Function App 上下文中。
一些示例代码:
import asyncio
class myClass(object):
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
#asyncio.create_task(self.f('abc'))
self.loop = asyncio.get_event_loop()
self.loop.run_until_complete(self.f('abc'))
async def f(self, x):
await asyncio.sleep(1)
self.x = x
if __name__ == '__main__':
cl = myClass(1,2)
print(cl.x)
这在这个简单的上下文中可以正常工作,但在 Azure Functions 中这样的更复杂的上下文中却不行,我试图在函数中使用 myClass,然后想使用它的“x”属性。
【问题讨论】:
-
你真的需要从
__init__调用异步函数吗?您可能希望在初始化后运行它或提供异步classmethod来运行异步代码,然后将结果传递给构造函数
标签: python python-asyncio