如何解决记录具有使用异步事件循环线程的表示的对象会暂停脚本
我一直在尝试使用 python websockets 库为 websocket 服务器创建客户端,但遇到了一个我无法修复的错误。
在记录使用 asyncio 库的对象时,脚本似乎无缘无故地停止。
这不是什么关键的事情,但它困扰着我,我不希望这在未来造成问题。
以下是重现此内容的示例代码:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import asyncio
import logging
from threading import Thread
logger = logging.getLogger(__name__)
class Main(Thread):
def __init__(self):
Thread.__init__(self,daemon=True)
self.loop = asyncio.get_event_loop()
self.running = True
logger.debug("Init")
def run(self):
""" Starts the main loop in the thread """
logger.debug("Thread Started")
asyncio.set_event_loop(self.loop)
# self.main_task = asyncio.run_coroutine_threadsafe(
# self._mainloop(),self.loop)
# self.loop.run_forever()
self.loop.run_until_complete(self._mainloop())
logger.debug("Thread Finished")
async def _mainloop(self):
""" Async main loop """
while self.running:
await self.wait(0.1,"_mainloop")
logger.debug("Test loop")
async def wait(self,t,text):
""" Example async function """
logger.debug("Wait... %s",text)
await asyncio.sleep(t)
logger.debug("Wait ok %s",text)
return "Main object"
def __repr__(self):
""" Uses an async function to get the repr """
fut = asyncio.run_coroutine_threadsafe(
self.wait(0,"__repr__"),self.loop)
return fut.result()
def close(self):
""" Waits for the main loop to end """
logger.debug("Closing...")
self.running = False
self.join()
# self.main_task.result()
logger.debug("Closing ok")
if __name__ == "__main__":
FORMAT = '%(name)-8s %(threadName)-10s %(levelname)-8s %(message)s'
logging.basicConfig(level=logging.DEBUG,format=FORMAT)
logger.info("Start")
m = Main()
m.start()
logger.info("1 %s",repr(m)) # Works fine
logger.info("2 %s",str(m)) # Works fine
logger.info("3 %s" % m) # Works fine
logger.info("4 %s",m) # Halts
logger.info(str(m)) # Works fine
logger.info(m) # Also halts
m.close()
logger.info("End")
输出到停止点:
__main__ MainThread INFO Start
asyncio MainThread DEBUG Using proactor: IocpProactor
__main__ MainThread DEBUG Init
__main__ Thread-1 DEBUG Thread Started
__main__ Thread-1 DEBUG Wait... _mainloop
__main__ Thread-1 DEBUG Wait... __repr__
__main__ Thread-1 DEBUG Wait ok __repr__
__main__ MainThread INFO 1 Main object
__main__ Thread-1 DEBUG Wait... __repr__
__main__ Thread-1 DEBUG Wait ok __repr__
__main__ MainThread INFO 2 Main object
__main__ Thread-1 DEBUG Wait... __repr__
__main__ Thread-1 DEBUG Wait ok __repr__
__main__ MainThread INFO 3 Main object
注释掉两个阻塞行后,脚本继续:
__main__ MainThread INFO 3 Main object
__main__ MainThread DEBUG Closing...
__main__ Thread-1 DEBUG Wait ok _mainloop
__main__ Thread-1 DEBUG Test loop
__main__ Thread-1 DEBUG Thread Finished
__main__ MainThread DEBUG Closing ok
__main__ MainThread INFO End
查看日志源代码,我无法找到可以解释这一点的内容。 https://github.com/python/cpython/blob/0bc17658f5724ce60c3f75acc01e7526f1720efe/Lib/logging/__init__.py#L365-L368
我尝试了不同的方法来创建 asyncio 事件循环,但没有任何区别。
我的代码有问题吗?这是使用异步和线程的正确方法吗?
如果有帮助,我正在使用 Python 3.9.6 和 Logging 0.5.1.2。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。