hardbyte / hardbyte/python-can

thread_safe_bus.state (getter) should not use locks

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

描述

### Problem description
I have a small application that listens on one thread, and may send on another (using asyncio). Before sending, I used to check the hardware state by evaluating the `.state` property. I use the thread safe bus.
However, this leads to long wait phases, depending on _incoming_ messages.

It turns out that getting the `.state` property locks both send and receive locks, whereas `lock_recv` is probably occupied by the listener most of the time, which causes the delays.
in `thread_safe_bus.py`:
```
@property
def state(self):
with self._lock_send, self._lock_recv:
return self.__wrapped__.state
```

### Proposed change

I am not very familiar with thread-safe communication in Python, but derived from my C++ knowledge, the value of the `.state` property is only an _enum value_ and should be _atomic_ anyway, especially when reading.
So from my point of view, I would either just return the value without locks. Or - if any locking is needed for some reason - use a separate state-access-lock that is independent from `lock_send` and `lock_recv`.

### Workaround

I guess checking the bus state before each `send()` call is not the correct way to do. I switched to a mere `send()` and catch a `CanError` exception afterwards, which works fine without delay.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

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