select.select()

Bhanu Karthik bhanukarthik2002 at gmail.com
Sat Nov 23 00:43:09 EST 2013


On Friday, 22 November 2013 18:15:10 UTC-8, Roy Smith  wrote:
> In article <b8d42424-e0ab-4595-9c87-25e5c1b53349 at googlegroups.com>,
> 
>  Bhanu Karthik <bhanukarthik2002 at gmail.com> wrote:
> 
> 
> 
> > please help me.. what does the following line do?
> 
> > 
> 
> > read_sockets,write_sockets,error_sockets = 
> 
> > select.select(CONNECTION_LIST,[],[])
> 
> 
> 
> This is a little tricky.
> 
> 
> 
> First,read the docs at http://docs.python.org/2/library/select.html.  
> 
> There's a lot of complicated stuff there, but just concentrate on the 
> 
> description of the select.select() call for now.
> 
> 
> 
> Imagine a process which has a lot of network connections open.  A great 
> 
> example would be something like a MUD (Multi User Dungeon).  You've got 
> 
> one server process(*) and a bunch of clients which have all made TCP 
> 
> connections over individual sockets.
> 
> 
> 
> Each client will be sending commands asynchronously, and the server 
> 
> needs to handle this.  You need some way to figure out which of those 
> 
> sockets have something that's been sent to you (which you need to 
> 
> process) and which are just sitting idle.  That's where select() comes 
> 
> in.  It gives you a way to say, "Here's a list of sockets.  Sleep until 
> 
> one of them has something available for me to read, and let me know 
> 
> which one."
> 
> 
> 
> One bit of complication is that you can also check for sockets which are 
> 
> ready to be written on, and sockets which have some sort of error 
> 
> condition.  That's why the call returns a 3-tuple.  But, for now, let's 
> 
> just concentrate on reading.
> 
> 
> 
> Here's a very simplistic server which uses select():
> 
> 
> 
> import socket
> 
> import select
> 
> 
> 
> sock = socket.socket()
> 
> sock.bind(('localhost', 23000))
> 
> sock.listen(10)
> 
> 
> 
> # Accept four connections.
> 
> connections = []
> 
> for i in range(4):
> 
>     s, addr = sock.accept()
> 
>     print "Got connection from %s" % str(addr)
> 
>     connections.append(s)
> 
> 
> 
> while True:
> 
>     readable, _, _ = select.select(connections, [], [])
> 
>     print "ready for reading: %s" % readable
> 
>     for s in readable:
> 
>         data = s.recv(1024)
> 
>         print "Read from %s: %s" % (s, data)
> 
> 
> 
> You can write a little client which connects to this (I've got one I 
> 
> used for testing, but I'll leave it to you to write one yourself as an 
> 
> exercise).  Connect four clients, and have them send some input in 
> 
> random order.
> 
> 
> 
> Actually, this server has a bug (which you'll discover as soon as you 
> 
> close one of the four connection), but it should serve to illustrate the 
> 
> basic concept.
> 
> 
> 
> 
> 
> (*) I'm not sure if real MUDs are programmed this way, but it's a 
> 
> plausible architecture.  For simplicity sake, I'm assuming a 
> 
> single-threaded server.

Thank you for your reply.your reply helped me figure out concept.



More information about the Python-list mailing list