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
Using the can library with async enabled Notifier change the thread which all callbacks is called from. Without async, the notifier callbacks are run in the thread of the can rx thread. With async, it runs the callbacks via loop.call_soon_threadsafe() which cause the notifier callbacks to be run in the main async thread instead. This changes behavior for all callbacks, not just async callbacks, which is unexpected. E.g. if using a non-async can protocol stack plus another async protocol stack together might create problems due to the change of callback threads.
I propose a fix that prevents the async call_soon_threadsafe in Notifier._rx_thread() with the introduction of a setting run_message_reception_in_eventloop. Then the user can chose to opt out of running the regular non-async callbacks in the asyncio main thread. The default should be True so we don't change the current behavior.
A change is required in Notifier._on_message_received(). This function might be called in either threads, so calling the asyncio coroutine must be made thread safe:
Using the can library with async enabled
Notifier
change the thread which all callbacks is called from. Without async, the notifier callbacks are run in the thread of the can rx thread. With async, it runs the callbacks vialoop.call_soon_threadsafe()
which cause the notifier callbacks to be run in the main async thread instead. This changes behavior for all callbacks, not just async callbacks, which is unexpected. E.g. if using a non-async can protocol stack plus another async protocol stack together might create problems due to the change of callback threads.python-can/can/notifier.py
Lines 111 to 119 in 5d62394
I propose a fix that prevents the async call_soon_threadsafe in
Notifier._rx_thread()
with the introduction of a settingrun_message_reception_in_eventloop
. Then the user can chose to opt out of running the regular non-async callbacks in the asyncio main thread. The default should beTrue
so we don't change the current behavior.A change is required in
Notifier._on_message_received()
. This function might be called in either threads, so calling the asyncio coroutine must be made thread safe:When looking at this, #1938 and #1912 should be addressed in the same round.
The text was updated successfully, but these errors were encountered: