我有一個用Python編寫的小型服務器/客戶端腳本。epoll和socket在分叉兒童接受問題
server.py創建一個新的套接字並生成兩個子節點。 在子進程中我註冊了EPOLLIN事件的socket des criptor,所以 我可以在子進程中對套接字進行接受。問題是,兩個孩子都在客戶端請求上通知了 ,但只有一個孩子接受了,另一個孩子則拋出了一個異常「[Errno 11]資源暫時不可用」。 如何防止所有兒童獲得通知,如果他們無法在套接字上進行接受?
--- --- server.py
import socket, time, os, select
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 10000))
sock.listen(256)
sock.setblocking(False)
for _ in range(0,2):
pid = os.fork()
if pid == 0: #in child
poll = select.epoll()
poll.register(sock.fileno(), select.EPOLLIN)
while True:
events = poll.poll(2) # listening for events with 2 sec timeout
for fileno, event in events:
if event & select.EPOLLIN: # there is data on socket available
print("EPOLLIN in PID: " + str(os.getpid()))
try:
clientsock, addr = sock.accept()
clientsock.close()
print("accepted and closed in PID: " + str(os.getpid()))
except Exception as e:
print("PID: " + str(os.getpid()) + " " + str(e))
# we are in parent process, keep it live
while True:
time.sleep(10)
客戶端火災只有一個請求給服務器:
--- --- client.py
import socket, time, select, sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',10000))
s.setblocking(False)
s.close()
執行「client.py」後,我得到服務器的以下輸出:
EPOLLIN in PID: 9424
EPOLLIN in PID: 9425
PID: 9424 [Errno 11] Resource temporarily unavailable
accepted and closed in PID: 9425
正如你所看到的,他們都得到一個EPOLLIN,但只有一個確實接受,其他的 一個拋出異常。
是否可以忽略第二個客戶端中的錯誤? – 2014-11-05 11:04:24