我正在一个连续发送数据到客户端的服务器上工作。该客户端也可以与发送特定请求的服务器交互守时。我写了一个守护进程来做到这一点。请注意,这个守护进程在一个线程中工作。现在,脚本结构如下:Python,通过两个套接字进行通信
class MyDaemon(threading.Thread):
def __init__(self):
# Init Stream socket (output)
self.MainSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.MainSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.MainSock.bind(('', 15555))
self.MainSock.listen(5)
self.MainSock.setblocking(0)
# Init Request socket (input)
self.RequestSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.RequestSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.RequestSock.bind(('', 15556))
self.RequestSock.listen(5)
self.RequestSock.setblocking(0)
def run(self):
while True:
# Listen to connection on MainSock
try:
self.stream, address = self.MainSock.accept()
except:
pass
# Listen to connection on RequestSock
try:
self.request, address = self.RequestSock.accept()
except:
pass
if self.stream:
send_message_continuously() # it is a stream
if self.request:
recv_a_message_from_client()
do_whatever_action_the client_request()
的问题是:
只用蒸笼,一切工作正常。
只使用请求者,一切正常。
使用两个插座同时阻挡流光。
我看到一个线程无法同时连接(或连接)到两个套接字。我还读到,使用select
模块可能有助于处理这种问题,但我从来没有使用过它,并且我对在特定情况下使用它有点失落。
什么是更有效的方式来处理这个问题? 如何在我的特殊情况下设置select
? 将流发送到子线程并将请求发送到另一个会更高效/简单吗?
编辑:最后,我用了一个子线程的流
FWIW,在Python线程是关于一种单纯的方便,而不是效率(有一些例外,如调用C明确释放GIL的模块)。 – spectras