You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
The text was updated successfully, but these errors were encountered:
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, whereaslock_recv
is probably occupied by the listener most of the time, which causes the delays.in
thread_safe_bus.py
: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
andlock_recv
.Workaround
I guess checking the bus state before each
send()
call is not the correct way to do. I switched to a meresend()
and catch aCanError
exception afterwards, which works fine without delay.The text was updated successfully, but these errors were encountered: