31

Pyserial を使用してシリアル経由でデバイスと通信しようとしています。コマンドは継続的に送信する必要があるため、Python では while ループに配置する必要があります。

私は現在このコードを使用しており、python process takes 100% CPU を調べました:

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

このコードは機能します。ただし、送信速度は遅いです。間隔を短くして高速化を試みましたsleepが、CPU に負荷がかかりすぎているようです。

要するに、CPU リソースの消費を抑えながら、while ループを効果的に反復する方法はありますか?

4

3 に答える 3

62

遅い CPU 浪費の部分は、「シリアル送信を行う」ことです。短いスリープだけの while ループは、ごくわずかな CPU しか使用しません。

シリアル送信コードを表示できますか。高速化する方法があるかもしれません。

このかなり遅い CPU では、次のように表示されます。

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

次に、ループ内で追加の作業を行います。

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

それらをインタープリターで実行し、ctrl-C で各 while ループを停止しました。

于 2012-06-07T06:33:30.363 に答える
7

ヨアヒムの答えに対するあなたのコメントに関して:

次に、マイクロコントローラーのコードを再設計する必要があります。そうしないと、汎用コンピューターを、不要なコードを繰り返し処理するばかげた「マイクロコントローラー」に変えてしまうだけなので、CPU は 100% になります。コンピュータを誤って使用している場合のもう 1 つの症状は、ハードウェア モーターの速度が、シリアル インターフェイス経由でコマンドを送信する速度に依存することです。高レベルのロジックをホストするコンピューターで「コマンド」する必要があります。また、マイクロコントローラーは、モーターの低レベルの反復制御を処理する必要があります。

于 2012-08-27T18:48:55.930 に答える
3

速度と CPU 負荷の間で許容できるトレードオフを把握する必要があります。

短いバースト データを送信する必要があり、メッセージ間であまり処理を行わない場合は、平均値がまだ低い可能性があるため、短時間高い CPU 負荷に耐えられる可能性があります。

于 2012-06-07T05:59:36.253 に答える