素材牛VIP会员
如何实现Python多进程http服务器
 请***子  分类:Python  人气:719  回帖:3  发布于6年前 收藏

我想要用 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()
 标签:linuxpython

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv5 码农
39***81 PHP开发工程师 6年前#1

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

Lv3 码奴
li***09 软件测试工程师 6年前#2

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

Lv2 入门
li***ng PHP开发工程师 6年前#3

有tornado 异步框架可以使用

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取