我想用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()