MattM
MattM

Reputation: 1289

How to properly use timeout parameter in select?

I'm new to socket programming (and somewhat to Python too) and I'm having trouble getting the select timeout to work the way I want to (on the server side). Before clients connect, timeout works just fine. I give it a value of 1 second and the timeout expires in my loop every 1 second.

Once a client connects, however, it doesn't wait 1 second to tell me the timeout expires. It just loops as fast as it can and tells me the timeout expires. Here's a snippet of my code:

while running:
    try:
        self.timeout_expired = False
        inputready, outputready, exceptready = select.select(self.inputs, self.outputs, [], self.timeout)
    except select.error, e:
        break
    except socket.error, e:
        break

    if not (inputready):
        # Timeout expired
        print 'Timeout expired'
        self.timeout_expired = True

    # Additional processing follows here

I'm not sure if this is enough code to see where my problem is, so please let me know if you need to see more. Basically, after a client connects, it at least appears that it ignores the timeout of 1 second and just runs as fast as it can, continuously telling me "Timeout expired". Any idea what I'm missing?

Thanks much!!

Edit: I should clarify..."inputready" represents input from a client connecting or sending data to the server, as well as stdin from the server. The other variables returned from select are only server-side variables, and is what I'm trying to do is detect whether the CLIENT took too long to reply, so I'm only checking if inputready is empty.

Upvotes: 6

Views: 15177

Answers (2)

JDOaktown
JDOaktown

Reputation: 4474

"When the timeout expires, select() returns three empty lists. ...To use a timeout requires adding the extra argument to the select() call and handling the empty lists after select() returns."

readable, writable, exceptional = select.select(inputs, outputs, inputs,timeout)

if not (readable or writable or exceptional):
    print('  timed out, do some other work here', file=sys.stderr)

[https://pymotw.com/3/select/index.html][1]

Upvotes: 3

Mark Tolonen
Mark Tolonen

Reputation: 177991

It is only a timeout if inputready, outputready, and exceptready are ALL empty. My guess is you have added the client socket to both self.inputs and self.outputs. Since the output socket is usually writable, it will always show up in outputready. Only add the client socket to self.outputs if you are ready to output something.

Upvotes: 7

Related Questions