【发布时间】:2022-01-16 00:14:48
【问题描述】:
我正在尝试在 python 中实现 ocpp 库。有两个函数在 while 循环中连续运行,cp.start() 用于记录日志,cp.heartbeat 作为协议实习生心跳。当我想在我的例程中正常实现它们时,while 循环会阻塞事件循环,所以我希望它们作为线程。但图书馆似乎有问题。
async def main():
async with websockets.connect(
'ws://localhost:9000/CP_3',
subprotocols=['ocpp1.6']
) as ws:
cp = ChargePoint('CP_3', ws)
def start_logging(loop):
asyncio.set_event_loop(loop)
loop.create_task(cp.start())
loop.run_forever()
loop = asyncio.get_event_loop()
t = threading.Thread(target=start_logging, args=(loop,))
t.start()
await asyncio.gather(cp.send_heartbeat())
if __name__ == '__main__':
asyncio.run(main())
错误:
ConnectionResetError: [WinError 995] Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen
AssertionError
ERROR:asyncio:Error on reading from the event loop self pipe
loop: <ProactorEventLoop running=True closed=False debug=False>
AssertionError
ERROR:asyncio:Task exception was never retrieved
future: <Task finished name='Task-5' coro=<ChargePoint.start() done, defined at C:\Users\sasko\AppData\Local\Programs\Python\Python39\lib\site-packages\ocpp\charge_point.py:121> exception=ConnectionClosedOK('code = 1000 (OK), no reason')>
即使我将线程设置为守护进程,心跳也会起作用,但我不能再关闭程序了。 最终的目标是让 cp.start() 和 heartbeat 在一个线程中运行,这样我就可以在另一个逻辑中控制电动汽车的充电过程。
【问题讨论】:
标签: python asynchronous async-await python-asyncio