私はPythonに非常に慣れていません..Raspberry Pi用に構築しているアプリケーション用に複数のスレッドを作成するクラスを作成しています(したがって、GPIOピン)。これは基本的に、DB からいくつかのデータを取得し、スレッドを実行するクラスのインスタンスを作成し、それに 2 つの変数 (deviceGPIO と期間) を渡し、しばらく一時停止することで機能します。
基本的に問題は、固有の値が DB から引き出されてクラスに渡されているにもかかわらず、実行された 2 回目のスレッド インスタンスが重複していることです。一般的に kwargs と args の使用について少し混乱しているので、このスペースで何か助けていただければ幸いです..
クラス/スレッドコード:
class MyThreadWithArgs(threading.Thread):
def __init__(self, deviceGPIO="default value", duration="default value", group=None, target=None, name=None,
args=(), verbose=None, **kwargs):
threading.Thread.__init__(self, group=group, target=target, name=name,
verbose=verbose)
self.deviceGPIO = deviceGPIO
self.duration = duration
return
def run(self):
logging.debug('Current GPIO pin: %s', deviceGPIO)
#pause for some time...
time.sleep(duration)
logging.debug('ending')
return
インスタンスの呼び出し:
以下は、DB クエリの結果内で呼び出されます (たとえば、返された各 DB 行に基づいて各クラスが作成されます)。
for row in rows:
duration = int(row["programDuration"])
deviceGPIO = int(row["deviceGPIO"])
t = MyThreadWithArgs(args=(), kwargs={deviceGPIO, duration})
t.start()
結果:
以下は結果です(pythonログ出力)
(Thread-1 ) Current GPIO pin: 12
(Thread-2 ) Current GPIO pin: 16
(Thread-3 ) Current GPIO pin: 16
(Thread-1 ) ending
(Thread-2 ) ending
(Thread-3 ) ending
クラスに渡された変数をクリアしようとしましたが、2番目の2つのインスタンスが重複した結果を表示しているため(クラスに渡された一意のDBレコードがあるにもかかわらず)、成功しませんでした。
ここで簡単なものが欠けていますか?
アップデート
提供されたフィードバックを使用してスクリプトを更新しましたが、変更しても重複した値が表示され続けました。最後に、次のコードを使用しましたが、変数を使用するのではなく、変数としてdeviceGPIO
使用self.deviceGPIO
しました。なぜこれが機能したのかはわかりません。どこで間違ったのかself.deviceGPIO
、同じ値を持つ元の変数と比較して違いが生じた理由を理解したいと思っています。
class MyThreadWithArgs(threading.Thread):
def __init__(self, deviceGPIO="default value", duration="default value", **kwargs):
threading.Thread.__init__(self, **kwargs)
self.deviceGPIO = deviceGPIO
self.duration = duration
def run(self):
logging.debug('Current GPIO pin: %s', self.deviceGPIO)
#pause for some time...
time.sleep(duration)
logging.debug('ending')