Efficient and fast Python While loop while using sleep()

Question:

I am attempting to communicate with a device over serial using Pyserial. As commands need to be continually sent, they have to be placed in a while loop in Python.

I am currently using this code, and have taken a look at python process takes 100% CPU:

while True:
    #do some serial sending here
    time.sleep(0.2)

This code works. However, the sending speed is slow. I tried to make it faster by decreasing the sleep interval, but it seems to load the CPU a bit too much.

In short, is there a any way to effectively iterate over a while loop forever, while still maintaining a low consumption of CPU resources?

Asked By: jhtong

||

Answers:

You have to figure out the tradeoff you are willing to have between speed and CPU load.

If you have to send short bursts of data, while not doing so much between messages, then maybe you can live with high CPU load for a short time as the average might still be low.

The slow CPU wasting part is the “do serial sending”. The while loop with just a short sleep will use negligible CPU.

Can you show the serial sending code. There may be a way to speed that up.

On this rather slow CPU I see this:

import time
while True: time.sleep(0.2)      # 0% CPU
while True: time.sleep(0.02)     # 0% CPU
while True: time.sleep(0.002)    # 0.5% CPU
while True: time.sleep(0.0002)   # 6% CPU
while True: time.sleep(0.00002)  # 18% CPU

Now do some extra work in the loop:

import time
while True: range(10000) and None; time.sleep(0.2)      # 1% CPU
while True: range(10000) and None; time.sleep(0.02)     # 15% CPU
while True: range(10000) and None; time.sleep(0.002)    # 60% CPU
while True: range(10000) and None; time.sleep(0.0002)   # 86% CPU

I ran those in the interpreter and stopped each while loop with ctrl-C.

Answered By: John La Rooy

In regards to your comment on Joachim’s answer:

Then your microcontroller code needs a redesign. Otherwise you’re just turning you general-purpose computer into nothing more than a dumb “microcontroller” that iterates over unneeded code repeatedly, hence the 100% cpu. Another symptom of you using your computer incorrectly is the fact that your hardware motor’s speed depends on the speed at which you send commands to it via the serial interface. You need to “command” it with the computer which will host your high-level logic. And your micro-controller needs to handle the low-level, repetative control of the motor.

Answered By: Zoran Pavlovic
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.