具有多个进程的异步服务器

2024-04-26 02:50:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用prefork异步体系结构实现一个web服务器。你知道吗

我使用python3.4并实现自己的事件循环。我创建套接字,使其非阻塞,然后派生进程。之后,我初始化事件循环的DefaultSelector。但我在不同的过程中收到相同的事件。然后在其中一个进程中,我得到IOBlockingError,因为事件已经被处理了。我应该如何使用DefaultSelector来避免在不同的进程中获得相同的事件?你知道吗

这是我的密码:

import socket
import os
from selectors import DefaultSelector, EVENT_READ, EVENT_WRITE


def main():
    def readable(soc, mask):
        try:
            conn, addr = sock.accept()
        except:
            print('here the problem')
            return

        selector.register(conn, EVENT_READ, readable2)

    def readable2(conn, mask):
        selector.unregister(conn)
        data = conn.recv(100000)
        selector.register(conn, EVENT_WRITE, writable)

    def writable(conn, mask):
        conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
        selector.unregister(conn)
        conn.close()

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setblocking(False)

    sock.bind(('', 8070))
    sock.listen(1000)

    os.fork()
    selector = DefaultSelector()
    selector.register(sock.fileno(), EVENT_READ, readable)
    while True:
        events = selector.select()
        for key, mask in events:
            callb = key.data
            callb(key.fileobj, mask)


if __name__ == "__main__":
    main()

Tags: keyimporteventregisterread进程maindef