飞书python sdk(lark-channel-sdk)
· python fastapi
lark-channel-sdk集成到异步框架里发生This event loop is already running问题
将飞书sdk集成fastapi项目中出现event loop问题。
[Lark] [2026-06-26 20:35:57,777] [ERROR] connect failed, err: This event loop is already running
Traceback (most recent call last):
Process SpawnProcess-11:
File "/home/hyman/fastApiProject/.venv/lib/python3.13/site-packages/lark_channel/ws/client.py", line 227, in start
loop.run_until_complete(self._connect())
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/asyncio/base_events.py", line 701, in run_until_complete
self._check_running()
~~~~~~~~~~~~~~~~~~~^^
File "/usr/lib/python3.13/asyncio/base_events.py", line 637, in _check_running
raise RuntimeError('This event loop is already running')
RuntimeError: This event loop is already running
解决方案:
- 将sdk放在单独的线程里。不同线程的event loop相互独立
- 注意包的导入时机,sdk的event loop 在包里面,主线程导入会有问题
sdk 无法共享主线程的事件循环。
示例代码
import threading
from fastapi import FastAPI
app = FastAPI()
# 放到这里就会报错,sdk会拿主线程的event loop
# from lark_channel import FeishuChannel
def sub_thread():
import asyncio
import os
# 放到这里就能正常运行
from lark_channel import FeishuChannel
channel = FeishuChannel(
app_id='cli_xxx',
app_secret='OMmpyV4N_XXX',
)
async def on_message(msg):
await channel.send(
msg.chat_id,
{"text": f"echo: {msg.content_text}"},
)
channel.on("message", on_message)
print("connecting...")
asyncio.run(channel.connect())
print("sub_thread exit")
@app.get("/")
async def root():
thread = threading.Thread(target=sub_thread,daemon=True)
thread.start()
return {"message": "Hello World"}