如何使用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响应的构建逻辑,把消息返回给客户端。
使用步骤
- 运行代码,服务会启动在
http://localhost:8000 - 用浏览器或curl访问
http://localhost:8000/block,这个请求会处于挂起(阻塞)状态 - 再开一个窗口访问
http://localhost:8000/unblock,之前的阻塞请求会立刻收到响应并完成处理
内容的提问来源于stack exchange,提问作者Ankur
相关产品推荐
相关产品推荐

