[Python lark-oapi 1.6.7] ws/client.py module-level event loop causes RuntimeError when first imported inside a running loop
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 74/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- python
- Área
- networking
Línea de trabajo
Comienza con lark_oapi/ws/client.py, especialmente con la configuración del bucle a nivel de módulo en las líneas 30-34 y las llamadas a run_until_complete alrededor de las líneas 163, 169, 171 y 176. Ejecuta la reproducción proporcionada con asyncio.run y, después, sigue el comportamiento de Client.start() y de su worker-thread. El trabajo estará terminado cuando el cliente pueda importarse e iniciarse por primera vez dentro de un bucle asyncio en ejecución sin producir el RuntimeError.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Environment
- Package:
lark-oapi1.6.7 (Python) - Python: 3.9+
- Affected path:
lark_oapi/ws/client.py
Summary
lark_oapi/ws/client.py captures the event loop at module import time via a module-level global. If the module is first imported while an event loop is already running (e.g. inside asyncio.run()), the subsequent loop.run_until_complete(...) raises RuntimeError: This event loop is already running, and the WebSocket long-connection fails immediately.
Root Cause
client.py lines 30-34 run at import time:
try:
loop = asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
Under Python 3.9, asyncio.get_event_loop() returns the currently running loop when called from within a coroutine / asyncio.run() context, so the module-level loop captures an already-running loop.
client.py then uses this global in start():
# client.py:163, 169, 171, 176
loop.run_until_complete(self._connect())
...
loop.run_until_complete(_select())
Calling run_until_complete on an already-running loop raises RuntimeError: This event loop is already running.
Reproduction
import asyncio
async def main():
from lark_oapi.ws.client import Client # first import here captures the running loop
Client(...).start() # RuntimeError: This event loop is already running
asyncio.run(main())
Real-world Trigger
Host applications that lazily import lark_oapi.channel (which transitively imports lark_oapi.ws.client) from within their asyncio main loop hit this unconditionally on first startup.
Suggested Fix
Remove the module-level loop global; create a dedicated event loop per Client instance inside the worker thread in start(), isolating the WS client from the caller's event loop.
- Lenguaje dominante
- Python
- Estrellas
- 559
- Forks
- 102
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
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 larksuite/oapi-sdk-python
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
larksuite/oapi-sdk-python#163 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
larksuite/oapi-sdk-python#162 · 1 comentario ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 94/100
larksuite/oapi-sdk-python#161 ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
larksuite/oapi-sdk-python#160 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
larksuite/oapi-sdk-python#159 ·
Todos los issues de larksuite/oapi-sdk-python
Issues similares
-
documentation help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
simonw/sqlite-utils#872 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100