4

カスタムの Python インタープリターを構築し、関数を定期的に呼び出してセンサーの読み取り値を取得し、その読み取り値を循環バッファー内に格納するバックグラウンド スレッドを開始する関数を作成しようとしています (deque最大長の を使用して実装)。 .

以下は、実装の縮小版を示しています。私たちが直面している問題はmonitor_sensor()、バックグラウンド スレッドを開始するためにインタープリターから呼び出したときに、バックグラウンド スレッドのコードが 1 回しか実行されないように見えることです (これは の内容を見て判断しましたsensor_values)。また、( を使用して) インタープリターを終了しようとするとexit()、インタープリターがハングし、終了しません。

import code
import collections
import threading

def get_sensor_reading():
    return 5.0

sensor_values = {}

def monitor_sensor():
    sensor_values['sensor_1'] = collections.deque(maxlen=1000)
    background_thread = threading.Thread(target=run_monitor_sensor, args=[sensor_values, get_sensor_reading])
    background_thread.start()

def run_monitor_sensor(sensor_values, read_sensor_cmd):
    while True:
        reading = read_sensor_cmd()
        sensor_values['sensor_1'].append(reading)
        import time
        time.sleep(1)

imported_objects = {'monitor_sensor': monitor_sensor,
                    'sensor_values': sensor_values}

code.interact(local=imported_objects)

以下は、バックグラウンド スレッドを実行して保存されたデータを確認しようとするインタープリター セッションのダンプを示していますsensor_values

218> python manage.py example
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> monitor_sensor()
>>> sensor_values
{'sensor_1': deque([5.0], maxlen=1000)}
>>> sensor_values
{'sensor_1': deque([5.0], maxlen=1000)}

問題は への呼び出しにあるようtime.sleep(1)です。これを削除すると、バッファがすぐに値でいっぱいになります。この問題が発生する理由と、その回避方法を教えてください。

アップデート

import timeループ内からモジュール レベルに移動することで、この問題を解決しました。なぜこれで問題が解決するのか、これまでのところ手がかりはありませんが、誰かがこれに答えることができれば、その答えを受け入れるでしょう.

4

1 に答える 1