[Python lark-oapi 1.6.7] ws/client.py module-level event loop causes RuntimeError when first imported inside a running loop

Abierto
#133 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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-oapi 1.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

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de larksuite/oapi-sdk-python

Todos los issues de larksuite/oapi-sdk-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.