0

私は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')
4

1 に答える 1

0

変数を正しく渡していません。

t = MyThreadWithArgs(args=(), kwargs={deviceGPIO, duration})

2 つの新しいキーワード引数を作成します。メソッドのkwargs引数を効果的に次のように設定します。__init__

{'args': (), 'kwargs': {<deviceGPIO value>, <duration value>}}

kwargs値は辞書ではなくsetです。

メソッドでは、これらの 2 つの値に特定の引数を指定していないため、代わりに and__init__のデフォルト値を使用しています。deviceGPIOduration

使用する:

t = MyThreadWithArgs(deviceGPIO=deviceGPIO, duration=duration)

deviceGPIOとのduration値をキーワード引数に明示的に渡して、スレッド サブクラスのインスタンスを作成します。

残りの引数を指定する予定がない場合は、クラス自体に既にこれらのデフォルトがあるためThread.__init__、それらを完全に省略できます。Thread

class MyThreadWithArgs(threading.Thread):
        def __init__(self, deviceGPIO="default value", duration="default value"):
            threading.Thread.__init__(self)

            self.deviceGPIO = deviceGPIO
            self.duration = duration

returnここでも は必須ではないことに注意してください。いつでも引数を追加し直すか、次を使用できます。

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

追加のキーワード引数をメソッドに渡し、必要に応じてまたはなどのキーワード引数を追加して新しいインスタンスThread._init__()を作成できるようにします。MyThreadWithArgs()groupname

于 2013-11-12T10:58:59.623 に答える