Python socket.accept nonblocking?
You probably want something like select.select()
(see documentation). You supply select()
with three lists of sockets: sockets you want to monitor for readability, writability, and error states. The server socket will be readable when a new client is waiting.
The select()
function will block until one of the socket states has changed. You can specify an optional fourth parameter, timeout
, if you don't want to block forever.
Here is a dumb echo server example:
import select
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', 8888))
server_socket.listen(5)
print "Listening on port 8888"
read_list = [server_socket]
while True:
readable, writable, errored = select.select(read_list, [], [])
for s in readable:
if s is server_socket:
client_socket, address = server_socket.accept()
read_list.append(client_socket)
print "Connection from", address
else:
data = s.recv(1024)
if data:
s.send(data)
else:
s.close()
read_list.remove(s)
Python also has epoll
, poll
, and kqueue
implementations for platforms that support them. They are more efficient versions of select
.
You can invoke the setblocking(0)
method on the Socket to make it non-blocking. Look into the asyncore module or a framework like Twisted.