【发布时间】:2019-08-18 16:28:57
【问题描述】:
这是一个示例代码。
class Foo:
def __init__(self):
self._run_coro()
def _run_coro(self):
async def init():
bar = #some I/O op
self.bar = bar
loop = asyncio.get_event_loop()
loop.run_until_complete(init())
async def spam(self):
return await #I/O op
async def main():
foo = Foo()
await foo.spam()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
当我运行这段代码时,我得到以下异常:
RuntimeError: This event loop is already running
如果我在main 之外初始化Foo,代码将毫无例外地运行。我想初始化Foo,以便在初始化期间运行一个协程,该协程创建一个类属性bar。
我无法弄清楚如何正确地做到这一点。如何从__init__ 运行协程。
任何帮助将不胜感激。
class Foo:
def __init__(self):
self.session = requests.Session()
self.async_session = None
#I guess this can be done to initialize it.
s = self.init_async_session()
try:
s.send(None)
except StopIteration:
pass
finally:
s.close()
async def init_async_session(self):
#ClientSession should be created inside a coroutine.
self.async_session = aiohttp.ClientSession()
初始化self.async_session的正确方法是什么
【问题讨论】: