厚街响应式网站设计,网页设计比较优秀的网站,wordpress中文转英文版,做那个网站的小编比较好在上一节#xff0c;我们讲述了最简单最基础的后线程的建立#xff0c;现在我们将进行拓展 Flask应用中处理异步事件#xff08;后台线程事件循环#xff09;的方法#xff08;1#xff09; 在我们的实际应用当中#xff0c;我们需要定义三个东西 一个多线程的信号旗我们讲述了最简单最基础的后线程的建立现在我们将进行拓展 Flask应用中处理异步事件后台线程事件循环的方法1 在我们的实际应用当中我们需要定义三个东西 一个多线程的信号旗这里的信号旗指的是多线程编程中一个非常基础且重要的同步工具 它只有两种状态 Clear (清除/未设置): 信号灯是红色的旗子是放下的。 Set (设置): 信号灯是绿色的旗子是举起的。 当进程调用event.wait()如果此时事件是 “Clear” 状态红灯那么这个线程就会停下来进入等待状态被阻塞。 一个 循环的对象 一个新线程
接下来在这里我们看到了有一个target参数这个就是调用我们的一个说明书
# 1. 创建一个线程同步工具mcp_ready_event threading.Event()# 2. 创建一个新的 asyncio 事件循环对象background_event_loop asyncio.new_event_loop()# 3. 创建一个新线程目标是运行 start_event_loop 函数loop_thread threading.Thread(targetstart_event_loop, args(background_event_loop, mcp_ready_event),daemonTruenamename)loop_thread.start() # 启动这个新线程# 4. 主线程在这里暂停等待后台线程通知logging.info(主线程正在等待 MCP 初始化...)is_ready mcp_ready_event.wait(timeout30.0) # 暂停30秒等待加载那么我们的说明书怎么写呢这里举例mcp的连接初始化 初始化这里无论成功还是失败初始化流程走完后调用 .set() 来释放正在 wait() 的主线程。
# ... existing code ...
async def initialize_mcp_connection(ready_event: threading.Event):在应用启动时启动MCP服务器并建立一个持久的会话。完成后通过 event 通知主线程。# ...try:# 初始化代码except Exception as e:# ... 错误处理 ...finally:logging.info(MCP 初始化过程结束通知主线程。)ready_event.set() 初始化完毕之后我们就进行接下来的开始线程 这里的参数 loop: asyncio.AbstractEventLoop 和 ready_event: threading.Event 是什么意思 这是一种现代 Python 的语法叫做 类型提示 (Type Hinting)。它本身不强制任何东西但它极大地增强了代码的可读性和可维护性并且能被很多开发工具利用来进行代码检查。
loop: asyncio.AbstractEventLoop: 这行代码的意思是我们期望 loop 这个参数是一个 asyncio.AbstractEventLoop 类型的对象。它告诉任何阅读或调用这个函数的人“请给我一个 asyncio 的事件循环对象。”ready_event: threading.Event: 同理这表示我们期望 ready_event 这个参数是一个我们刚才讲的 threading.Event 类型的对象。
def start_event_loop(loop: asyncio.AbstractEventLoop, ready_event: threading.Event):在一个线程中启动事件循环并在启动时安排MCP初始化。asyncio.set_event_loop(loop) loop.create_task(initialize_mcp_connection(ready_event)) logging.info(后台事件循环已启动MCP 初始化任务已安排。)loop.run_forever()
需要注意这里start_event_loop 函数中的 loop和主线程中的 background_event_loop虽然名字不同但它们指向的是内存中同一个事件循环对象。
最后只需要运行一个专门用于从一个普通线程向一个正在运行 asyncio 事件循环的线程提交任务。
asyncio.run_coroutine_threadsafe(coro, loop):