如何实现Python多进程http服务器

我想要用 python 的 multiprocessing 模块实现一个多进程多线程的 http 服务器,服务器会使用进程池 Pool 创建多个子进程,然后每个子进程再用 socketserver 创建多线程的 http 服务器,但是现在我遇到一个问题,就是服务器运行以后,只有第一个子进程可以处理 http 连接,如何做到让每一个子进程都可以处理连接?

备注:通过 getpid 可以看到每次接受请求的都是同一个子进程

# Python 3

import os, socketserver, signal, sys
from multiprocessing import Pool

class MyTCPHandler(socketserver.BaseRequestHandler):

    def handle(self):
        self.data = self.request.recv(1024)
        respone = b'HTTP/1.1 200 OK\r\n\r\nOK%d' % os.getpid()
        self.request.sendall(respone)

def httpd_task():
    socketserver.ThreadingTCPServer.allow_reuse_address = True
    server = socketserver.ThreadingTCPServer(('0.0.0.0', 80), MyTCPHandler)
    try:
        server.serve_forever()
    except:
        pass
    server.server_close()

if __name__=='__main__':

    p = Pool(4)
    for i in range(4):
        p.apply_async(httpd_task)
    p.close()
    p.join()
阅读 5.7k
3 个回答

端口只能绑定一个进程。
1 换成线程实现 SocketServer.ThreadingTCPServer
2 主进程调度分发。主进程收到端口请求后通过进程间通信让其他进程工作。

这样是不行的吧,80端口被第一个子线程占用了,其它子线程监听不了吧。

有tornado 异步框架可以使用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题