使用multiprocessing配合BaseHTTPRequestHandler出现_thread.lock报错
问题原因
- Python multiprocessing模块在创建子进程时(macOS/Windows默认使用spawn启动模式),需要将传递给子进程的所有对象做序列化(pickle)处理。而
ThreadingHTTPServer内部内置了和系统线程绑定的_thread.lock锁对象,这类对象无法被序列化,直接传递就会抛出你遇到的报错。 - 你不需要将HTTP服务实例交给
multiprocessing.Manager管理,Manager仅用于多进程间共享状态变量,HTTP服务只需要在子进程内独立运行即可,不需要跨进程共享实例。 - 你选用的
ThreadingHTTPServer本身就是基于线程实现请求并发的,和你不想使用threading模块的需求冲突。
修复后代码
import multiprocessing from http.server import HTTPServer, BaseHTTPRequestHandler # 自定义RequestHandler实现业务逻辑 class CustomRequestHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.end_headers() self.wfile.write(b"test response") def run_http_server(): # 服务实例在子进程内部初始化,不需要跨进程传递 httpd = HTTPServer(('localhost', 4433), CustomRequestHandler) httpd.serve_forever() if __name__ == '__main__': running_server = multiprocessing.Process(target=run_http_server) running_server.start() # 主进程可执行其他逻辑,需要停止服务时调用 running_server.terminate()
生产级工具库推荐
- Gunicorn:成熟的WSGI服务器,原生支持多进程工作模式,无需手动管理进程,简单配置即可实现真正的并行请求处理,适合正式环境部署同步Web服务。
- Uvicorn:ASGI服务首选服务器,支持多进程启动,同时兼容异步、同步业务逻辑,性能表现优异,适合FastAPI、新版Django等异步框架使用。
- 手动基于
http.server封装的服务仅适合本地调试用,不要用于生产环境,其性能、安全性都没有经过生产验证。
内容的提问来源于stack exchange,提问作者Ryan Nygard
相关产品推荐
相关产品推荐

