For whatever reason, you're ending up with a lot of open files and/or
sockets
(and/or any other resource based on file descriptors). That results
in new
file descriptors having large values (>=1024).
You cannot use select() with such file descriptors. Try poll() instead,
or Twisted. ;)
Poll is not good, because it does not wait. I cannot call poll() in a
loop and have 100% CPU used for nothing. Well of course I could call
time.sleep() if there is nothing to receive/send. But then it would
increase response times dramatically. The only thing I can use is
select.select(). Or do you have another idea?
You are talking about twisted - can someone tell me how twisted does this?
However, the use of select() you demonstrated is an unusual one, and not
very good. It looks like the only purpose is to work around a bug in
CPython on Windows where a process in a blocking read cannot be
interrupted
by C-c in the console?
Not just Ctrl+C. All of my threads are monitoring this event, and will
terminate within some seconds, if stop_requested.isSet(). This is a
multi-threaded program, and stop_requested.set() can be called from
several places:
- when a thread catches an exception that indicates an internal error in
the service
- when the program is killed, a TERM signal handler sets this event
- when Ctrl+C is pressed, in the main thread of the program
- when the program is requested to stop itself, over the network
- etc.
So for example, when I kill my program using the 'kill' command, it
cleans up everything before exiting.
I would really like to know what other options I have to implement this
efficiently. Is my approach bad?
Or am I using the wrong language? I started to use threads heavily in
the past months. Haskell might be a better choice for me, except that
Python is much more elegant. :-)
Thanks,
Laszlo
--
http://mail.python.org/mailman/listinfo/python-list