Python选择。选择以及将插座放入输出lis的线程

2024-10-04 09:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python客户机套接字的问题。在

我需要连接到服务器,我想:

  1. 如果最近10个套接字没有收到chr,则发送chr 秒
  2. 发送套接字接收到的每个chr
  3. 有一个线程,我们可以(异步地)决定发送一个chr 我们想什么时候都行

我试着用选择。选择方法。 这是我的代码:

class ThreadCollector(threading.Thread):
    def __init__(self, s, outputs):
        threading.Thread.__init__(self)
        self.__s = s
        self.__outputs = outputs
    def run(self):
        global message_queues
        time.sleep(12)
        message_queues.put("Y")
        self.__outputs.append(self.__s)
        time.sleep(30)

print "Start main process"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = "XXX.XXX.XXX.XXX"
port = 999999
s.connect((address, port))
inputs = [s]
outputs = []
message_queues = Queue.Queue()
ThreadCollector(s, outputs).start()
timeout = 10
while 1 == 1:
    readable, writable, exceptional = select.select(inputs, outputs, inputs, timeout)
    if not (readable or writable or exceptional):
        message_queues.put("T")
        outputs.append(s)
    else:
        for socketactivated in readable:
            if socketactivated is s:
                input = s.recv(1)
                message_queues.put(input)
                outputs.append(s)
        for socketactivated in writable:
            if socketactivated is s:
                message = message_queues.get_nowait()
                s.send(messaggio)
                outputs.remove(s)
print "End main process"

剧本效果很好。 如果达到超时,“T”chr将立即发送到目的地。在

但我有个问题。在

当线程将chr“Y”推送到“message_queues”并将套接字追加到输出列表时,脚本不会立即发送“Y”。它只在超时过期后发送“Y”,主脚本将“T”和套接字附加到列表中。在

只有在这次手术之后”选择。选择“醒来知道有东西要送。主脚本正确地看到输出列表包含两个套接字,消息队列两个chr(“Y”和“T”)。在

如果线程休眠,并且达到了超时,则进程正常,并且在主脚本填充“message_queues”和“outputs”之后立即发送“T”。在这种情况下,我可以看到脚本返回到选择。选择,它会立即理解输出列表有要发送的内容。在

为什么我的线不能告诉你”选择。选择“插座有东西要送吗?我能写些什么来唤醒你“选择。选择“从线上? 我能把这些信息放哪儿?在


Tags: self脚本message列表putsocketoutputs线程