加载中...
持续学习,持续分享
Eleksbai

飞书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

解决方案:

  1. 将sdk放在单独的线程里。不同线程的event loop相互独立
  2. 注意包的导入时机,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"}