Выберите API, не ожидающий указанное время ожидания

Я делаю комбинацию программирования Socket и pexpect в одном и том же коде. Я получил это работает, но с небольшим затруднением. API выбора ожидает 5 секунд в первой итерации. Как только он получил ввод от клиента, он больше не ждет в течение 5 секунд, даже если он указан в цикле. Короче говоря, после первого взаимодействия клиент-сервер, выбор не имеет никакого эффекта! Я понимаю, как обойти это в C++, но я сравнительно плохо знаком с Python и не могу понять причину. Я приложил приведенный ниже код, и он довольно простой.

#!/usr/bin/python
#Basic Functionailty: to create a process and to take inputs from client machines
#This input will be given to a background process which will display the user the parsed output
#using pexpect
import pexpect
import socket
import select

TCP_IP = '127.0.0.1'
TCP_PORT = 50050
BUFFER_SIZE = 1024

#spawning a pexpect process and printing everything before the prompt appears
child = pexpect.spawn('./pox.py')
child.expect ('POX>')
print child.before

#binding to a port number and acting as a server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((TCP_IP, TCP_PORT))
server.listen(1)
input = [server]

#loop infinitely and get input and serve it to the process
#in addition to which if the process shows some messages display
#it to the user
while 1:
  print 'Before select'
  inputready,outputready,exceptready = select.select(input,[],[],5)
  for s in inputready:
    if s == server:
      #if the input is from the server
      conn, addr = s.accept()
      print 'Connection address:', addr
      input.append(conn)
      data = conn.recv(BUFFER_SIZE)
      if not data: continue
      print "received data:", data
      child.sendline (data)

    else:
      #if a time out occurs check the pexpect if it has any debug messages
      i = child.expect ([pexpect.TIMEOUT, 'POX>'], timeout=1)
      print child.before
      if i == 0:
        print child.before

1 ответ

Решение

Вы изменили input:

input.append(conn)

(а затем называется conn.recv чтобы получить некоторые данные, которые будут блокироваться до тех пор, пока не появятся какие-либо данные или EOF, но, предположительно, их было несколько, и вы их получили).

Сделав это, при следующей поездке через цикл, вполне вероятно, что есть принимаемые данные, или EOF, готовые для ввода на conn, Я полагаю, вы немедленно позвоните child.expect (так как s == conn и поэтому s != server). Держу пари, что на данный момент, conn находится в EOF, так что возвращается немедленно, ничего не сделав. conn все еще открыт, и все еще в input так что каждый раз, когда вы звоните select сразу возвращается, сообщая, что вы можете прочитать другой EOF из conn,

Другие вопросы по тегам