I’m adapting this Django management command for my own purposes. The script is a simple while-loop daemon that reads from sys.stdin (line 152, in command.handle()) according to a protocol and writes results to sys.stdout.
I would expect sys.stdin.read() to block until it receives something, but I find that when I run this script, it eats up 100% CPU before any data has been sent or received.
- Does
sys.stdin.read(n)block? - If not, how can I make this daemon more polite?
- Is
time.sleep(s)safe to use, or will I miss input or be slow to respond?
By default,
sys.stdin.read()andsys.stdin.read(n)are blocking calls. I would assume the consumption of 100% CPU is actually attributable to streaming data into your script or some other behavior not cited here.Upon looking at the help documentation for
sys.stdin.read, I noticed this:(Emphasis mine.)
This implies blocking mode is the default behavior, which is consistent with my experience. It also led me to track down similar questions on SO. Voila:
Non-blocking read on a subprocess.PIPE in python
Good luck with your adaptation!