You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python的threading.Event实现任务同步?附示例代码

使用threading.Event实现HTTP服务的阻塞/解除阻塞同步

这里有个实用的示例,展示如何用Python的socketserver、http.server结合threading.Event,实现一个能通过HTTP请求控制阻塞状态的服务——核心就是用事件对象同步不同请求之间的状态:

import socketserver
from http.server import SimpleHTTPRequestHandler
from threading import Event

class Responder(SimpleHTTPRequestHandler):
    # 类级别Event对象,所有请求处理线程共享这个同步标志
    evt = Event()

    def do_GET(self):
        print(f'req: {self.path}')
        if self.path == '/block':
            # 进入阻塞状态,直到evt.set()被调用
            Responder.evt.wait()
            self.respond(f'已解除阻塞,来自/block路径')
        elif self.path == '/unblock':
            # 触发事件,唤醒所有等待该事件的线程
            Responder.evt.set()
            # 重置事件,让后续的/block请求可以再次进入阻塞
            Responder.evt.clear()
            self.respond(f'已发送解除阻塞信号')
        else:
            self.send_response(404)
            self.end_headers()
            self.wfile.write(b'404 Not Found')

    def respond(self, response_msg):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain; charset=utf-8')
        self.end_headers()
        self.wfile.write(response_msg.encode('utf-8'))

if __name__ == '__main__':
    with socketserver.TCPServer(('', 8000), Responder) as httpd:
        print('服务启动在http://localhost:8000')
        httpd.serve_forever()

核心逻辑拆解

  • 共享事件实例:Responder.evt是类属性,所有请求处理线程共用同一个Event对象,保证状态统一。
  • /block路径行为:访问该路径时,请求线程会调用evt.wait()进入阻塞,直到有其他线程触发事件。
  • /unblock路径行为:访问该路径会调用evt.set()唤醒所有等待的线程,紧接着evt.clear()重置事件,确保后续的/block请求能再次进入阻塞状态。
  • 统一响应处理:respond方法封装了HTTP 200响应的构建逻辑,把消息返回给客户端。

使用步骤

  1. 运行代码,服务会启动在http://localhost:8000
  2. 用浏览器或curl访问http://localhost:8000/block,这个请求会处于挂起(阻塞)状态
  3. 再开一个窗口访问http://localhost:8000/unblock,之前的阻塞请求会立刻收到响应并完成处理

内容的提问来源于stack exchange,提问作者Ankur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:40:15