カスタムの 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
ループ内からモジュール レベルに移動することで、この問題を解決しました。なぜこれで問題が解決するのか、これまでのところ手がかりはありませんが、誰かがこれに答えることができれば、その答えを受け入れるでしょう.