我正在构建一个 SMTP 服务器,并aiosmtpd使用这些示例作为构建的基础。下面是程序入口点的代码片段。
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.create_task(amain(loop=loop))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
Run Code Online (Sandbox Code Playgroud)
当我运行该程序时,我收到以下警告:
server.py:61: DeprecationWarning: There is no current event loop
loop = asyncio.get_event_loop()
Run Code Online (Sandbox Code Playgroud)
实现这个的正确方法是什么?
我见过使用运行阻塞代码
loop = asyncio.get_running_loop()
await loop.run_in_executor(None, blockingfunc)
Run Code Online (Sandbox Code Playgroud)
和
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, blockingfunc)
Run Code Online (Sandbox Code Playgroud)
我们什么时候应该使用asyncio.get_running_loop()vs asyncio.get_event_loop()?
我有一个调用asyncio循环的线程,但是这导致了所提到的异常:
RuntimeError: There is no current event loop in thread 'Thread-1'.
Run Code Online (Sandbox Code Playgroud)
这个问题:RuntimeError:异步+ apscheduler中的线程中没有当前事件循环遇到相同的问题,但是它们引用的是我没有的调度程序。
我的代码如下:
def worker(ws):
l1 = asyncio.get_event_loop()
l1.run_until_complete(ws.start())
l2 = asyncio.get_event_loop()
l2.run_forever()
if __name__ == '__main__':
ws = Server()
p = threading.Thread(target=worker,args=(ws,))
p.start()
while True:
try:
#...do sth
except KeyboardInterrupt:
p.join()
exit()
Run Code Online (Sandbox Code Playgroud)