1
0

スレッドによるデータポーリング監視

Posted at

言葉の定義

ポーリングとは:一定の間隔(時間)で監視対象の変化があるかをループで回し続けること
スレッドとは:1つのプログラム処理において、メインスレッドとサブスレッドなどで複数のスレッドを並行に並べて処理すること

監視対象クラスとは:データシミュレーションなどでクラスのメンバー変数や内部の値が更新されることを想定

監視クラス(ポーリングクラス)とは、監視対象クラスと別のクラスになっていて、監視対象クラスの内部データを監視する仕組みで構成されていることを想定

用途

・シミュレーション
・スクレイピング
・バッチ処理
・ログ監視

監視クラス(ポーリングクラス)

import time
import threading

class PollingClass:
    def __init__(self, observed_class, interval=0.5):
        self.observed_class = observed_class
        self.interval = interval
        self.running = False
        self.thread = None
    
    def start_polling(self):
        self.running = True
        self.thread = threading.Thread(target=self.polling_loop)
        self.thread.start()

    def stop_polling(self):
        self.running = False
        if self.thread is not None:
            self.thread.join()

    def polling_loop(self):
        while self.running:
            data = self.observed_class.get_data()  # 監視対象クラスからデータを取得
            self.process_data(data)  # データを処理
            time.sleep(self.interval)  # 次のポーリングまで待機

    def process_data(self, data):
        # データを処理するためのメソッド
        print("Received data:", data)

監視対象クラス

class ObservedClass:
    def __init__(self):
        self.data = None
    
    def update_data(self, new_data):
        self.data = new_data
    
    def get_data(self):
        return self.data

実行

# 監視対象のクラスを作成
observed_instance = ObservedClass()

# ポーリングクラスを作成し、監視対象を指定して開始
polling_instance = PollingClass(observed_instance)
polling_instance.start_polling()

# データ更新のシミュレーション
for i in range(5):
    observed_instance.update_data(i)  # データを更新
    time.sleep(1)  # ポーリング間隔より長い時間待機

# ポーリングを停止
polling_instance.stop_polling()

実行結果

Received data: None
Received data: 0
Received data: 1
Received data: 1
Received data: 2
Received data: 2
Received data: 3
Received data: 3
Received data: 4
Received data: 4
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0