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

时间:2016-09-04 13:12:10

标签: python asynchronous

我想用prefork异步架构实现一个Web服务器。

我使用python 3.4并实现自己的事件循环。我创建套接字,使其无阻塞,然后fork进程。之后,我为事件循环初始化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()

0 个答案:

没有答案