0

我对python很陌生。我正在编写一个类来为我为Raspberry Pi构建的应用程序创建多个线程(因此是GPIO引脚)。我基本上通过从数据库中提取一些数据,创建运行线程的类的实例,将两个变量(设备GPIO和持续时间)传递给它,然后暂停一段时间来实现这一点。

基本上问题是我的线程实例在第二次运行时重复了两次,尽管从数据库中提取了唯一值并传递给了类。一般来说,我对 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

我尝试清除传递给类的变量,但没有成功,因为第二个两个实例显示重复的结果(尽管有唯一的数据库记录被传递给类)。

我在这里错过了一些简单的东西吗?

更新

我使用提供的反馈更新了脚本,尽管我进行了更改,但它仍然继续显示重复的值。最后我使用了下面的代码,虽然我没有使用deviceGPIO变量,而是使用self.deviceGPIO了变量。我不确定为什么会这样——我很想知道我哪里出错了,以及为什么 usingself.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})

创建两个新的关键字参数;有效地将方法的kwargs参数设置__init__为:

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

kwargs是一个集合,而不是字典。

在该__init__方法中,您使用的是默认值,deviceGPIOduration不是,因为您从未为这两个值提供特定参数。

采用:

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

创建您的线程子类实例,将deviceGPIOandduration值显式传递给关键字参数。

如果您不打算指定其余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 回答