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

Reply via email to