言葉の定義
ポーリングとは:一定の間隔(時間)で監視対象の変化があるかをループで回し続けること
スレッドとは: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