Я пишу программу Python для взаимодействия с устройством на основе CAN-шины. Я успешно использую для этой цели модуль python -can. Я также использую asyncio для реакции на асинхронные события. Я написал класс CanBusManager, который используется классом CanBusSequencer. Класс «CanBusManager» заботится о создании / отправке / получении сообщений, а CanBusSequencer управляет последовательностью отправляемых сообщений. В какой-то момент в последовательности я хочу подождать, пока не будет получено определенное сообщение c, чтобы «разблокировать» остальные сообщения, которые будут отправлены в последовательности. Обзор в коде:
main.py
async def main():
event = asyncio.Event()
sequencer = CanBusSequencer(event)
task = asyncio.create_task(sequencer.doSequence())
await task
asyncio.run(main(), debug=True)
canBusSequencer.py
from canBusManager import CanBusManager
class CanBusSequencer:
def __init__(self, event)
self.event = event
self.canManager = CanBusManager(event)
async def doSequence(self):
for index, row in self.df_sequence.iterrows():
if:...
self.canManager.sendMsg(...)
else:
self.canManager.sendMsg(...)
await self.event.wait()
self.event.clear()
canBusManager.py
import can
class CanBusManager():
def __init__(self, event):
self.event = event
self.startListening()
**EDIT**
def startListening(self):
self.msgNotifier = can.Notifier(self.canBus, self.receivedMsgCallback)
**EDIT**
def receivedMsgCallback(self, msg):
if(msg == ...):
self.event.set()
На данный момент моя программа остается на await self.event.wait (), даже если соответствующее сообщение получено и выполняется self.event.set (). Запуск программы с debug = True показывает
RuntimeError: Non-thread-safe operation invoked on an event loop other than the current one
, которого я действительно не понимаю. Это связано с событием asyncio l oop, каким-то образом неправильно определенным / управляемым. Я пришел из мира C ++ и в настоящее время пишу свою первую большую программу с Python. Любое руководство было бы очень признательно :)