我正在开发一台不断向客户端发送数据的服务器。该客户端还可以与发送特定请求的服务器进行准时交互。我写了一个守护进程来做到这一点。请注意,此守护程序在一个线程中工作。目前,脚本的结构如下:
SELECT
scode
FROM TABLE1 T1
WHERE T1.scode NOT IN (
SELECT T2.subject FROM TABLE2 T2
)
问题在于:
只使用蒸笼,一切正常。
仅使用请求者,一切正常。
同时使用两个插座阻挡流光。
我读到单个线程无法同时连接(或连接)到两个套接字。我还读到使用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
?
将流发送到子线程并将请求发送给另一个线程会不会更有效/更简单?
编辑:最后,我使用了流
的子线程答案 0 :(得分:2)
使用select
时你必须测试,你的两个插座中哪一个可以接受:
def run(self):
while True:
ready, _, _ = select.select([self.MainSock, self.RequestSock],[],[])
for sock in ready:
if sock is self.MainSock:
send_message_continuously(sock.accept())
elif sock is self.RequestSock:
recv_a_message_from_client(sock.accept())
答案 1 :(得分:1)