【RPC-Python】多进程同步模型

上节我们完成了一个简单的多线程服务器,可以并发处理多个客户端连接。但是 Python 里多线程使用的并不常见,因为 Python 的 GIL 致使单个进程只能占满一个 CPU 核心,多线程并不能充分利用多核的优势。所以多数 Python 服务器推荐使用多进程模型。我们将使用 Python 内置的 进程模块创建子进程。

multiprocessing

多进程运行模型如下:
【RPC-Python】多进程同步模型_第1张图片

# server
# 关键代码部分

def loop(sock, handlers):
    while True:
        conn, addr = sock.accept()
        p = Process(target=handle_conn, args=(conn, addr, handlers))
        p.start()
        p.join()

运行结果和多线程的一致。

PreForking模型

采用 PreForking 模型可以对子进程的数量进行了限制。PreForking 是通过预先产生多个子进程,共同对服务器套接字进行竞争性的 accept,当一个连接到来时,每个子进程都有机会拿到这个连接,但是最终只会有一个进程能 accept 成功返回拿到连接。子进程拿到连接后,进程内部可以继续使用单线程或者多线程同步的形式对连接进行处理。
模型如下:
【RPC-Python】多进程同步模型_第2张图片

accept竞争

prefork 之后,父进程创建的服务套接字引用,每个子进程也会继承一份,它们共同指向了操作系统内核的套接字对象,共享了同一份连接监听队列。子进程和父进程一样都可以对服务套接字进行 accept 调用,从共享的监听队列中摘取一个新连接进行处理。

你可能感兴趣的:(Python,RPC)