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

查看:139
本文介绍了linux - 如何实现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()

解决方案

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

这篇关于linux - 如何实现Python多进程http服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆