【发布时间】:2014-11-05 10:50:10
【问题描述】:
我有一个用 Python 编写的小服务器/客户端脚本。
server.py 创建一个新的套接字并产生两个孩子。 在子进程中,我为 EPOLLIN 事件注册了套接字 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,但只有一个实际接受,另一个 一个抛出异常。
【问题讨论】:
-
是否可以忽略第二个客户端的错误?