Using async changes thread for non-async callbacks which is unexpected
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 52/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Tranquilo
- Stack tecnológico
- python
- Área
- networking
Línea de trabajo
Empieza por can/notifier.py en las líneas referenciadas de _rx_thread() y sigue _on_message_received() junto con la ruta de programación de asyncio. Revisa los issues #1938 y #1912 junto con este cambio. Se considera terminado cuando los callbacks no async puedan permanecer en el hilo de recepción de CAN cuando así se configure, mientras que los callbacks async se programen de forma segura desde cualquiera de los dos hilos sin cambiar el comportamiento predeterminado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
def _rx_thread(self, bus: BusABC) -> None:
# determine message handling callable early, not inside while loop
if self._loop and self.run_message_reception_in_eventloop: # <--- NEW
handle_message: Callable[[Message], Any] = functools.partial(
self._loop.call_soon_threadsafe,
self._on_message_received, # type: ignore[arg-type]
)
else:
handle_message = self._on_message_received
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:
def _on_message_received(self, msg: Message) -> None:
for callback in self.listeners:
res = callback(msg)
if res and self._loop and asyncio.iscoroutine(res):
# Schedule coroutine
# In __init__: self._tasks: set[asyncio.Task] = set()
task = asyncio.run_coroutine_threadsafe(res, self._loop)
When looking at this, #1938 and #1912 should be addressed in the same round.
- Lenguaje dominante
- Python
- Estrellas
- 1.6k
- Forks
- 697
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de hardbyte/python-can
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
hardbyte/python-can#2103 ·
-
bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
hardbyte/python-can#2077 · 1 comentario · 1 reacción ·
-
bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
hardbyte/python-can#1922 · 1 reacción ·
-
enhancement
Dificultad 5/5 Más de una semana Aptitud para principiantes 30/100
hardbyte/python-can#2102 ·
-
bug
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
hardbyte/python-can#2092 ·
Todos los issues de hardbyte/python-can
Issues similares
-
[Bug] reef-hermes tells me to resume with hermes --resume, which does not work from my shell Abiertoarea: harness bug status: needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Human-Agent-Society/reef#625 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 80/100
learningequality/kolibri#15351 · 2 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
Name consistency Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
eellak/triplestore#65 · 1 comentario ·