我对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')