hardbyte / hardbyte/python-can

Timeout in Notifier does not work as expected

未关闭
#1,932 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
bug
主要语言
Python
星标
1.6k
派生
697
PR 合并指标
30 天内没有已合并 PR

描述

### Describe the bug
I think, though being not sure, that the `timeout` in `Notifier` does not work as expected.
From the definition of `BusABC.recv(timeout)` in [here](https://github.com/hardbyte/python-can/blob/main/can/bus.py#L110) on timeout it returns `None` that is currently being discarded in `Notifier._rx_thread` as defined [here](https://github.com/hardbyte/python-can/blob/main/can/notifier.py#L123).

### To Reproduce
```python
import time
import can

class MyListener(can.Listener):
def on_message_received(self, msg: can.Message) -> None:
if msg is None:
print("Timeout occurred.")
else:
print(f'Message received: {msg}')

def main():
with can.Bus(interface="virtual", receive_own_messages=True) as bus:
print_listener = MyListener()
notifier = can.Notifier(bus, [print_listener], timeout=1.0)
time.sleep(2.0)
bus.send(can.Message(arbitration_id=1, is_extended_id=False))
notifier.stop()

if __name__ == "__main__":
main()
```

### Expected behaviour
I expect Listener to call "Timeout occurred." in the provided example.
Currently `on_message_received` is not called on timeout.

I would welcome discussion and help about how to realize timeout behaviour in Listener - Notifier architecture. I think there should be a way to let Listeners handle being starved.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。