在Python中不断运行类中的函数?

时间:2017-11-07 22:59:46

标签: python multithreading python-multithreading

我使用python-can轮询CAN总线以获取消息。我为此创建了一个类,如下所示。

class VS():
    def __init__(self):
        #code to initialise bus
        self.message = bus.recv() #to receive 1 message

    def speed(self):
        return self.message[1], self.message.timestamp

现在总线输出速度每100毫秒,所以当我运行以下

v = VS()
while(1):
    print(v.speed())
    time.sleep(1)

我将时间戳分隔100毫秒,而不是每1秒更新一次时间戳。这虽然滞后于实时,因为消息似乎存储在缓冲区或其他内容中。我想重写类/函数,以便我可以获得所需间隔的速度值(当然大于100毫秒)。我试图通过线程运行它并重新定义了速度函数。

def speed(self):
    threading.Timer(0.01,self.speed).start() 
    return self.message[1], self.message.timestamp

现在这种方法有效但在我的Raspberry Pi上只有一段时间了。我甚至通过threading.active_count()检查线程,然后从70开始,然后在线程252(RuntimeError: can't start new thread)中抛出异常。然后,线程计数以10为间隔从252减少到0,然后返回常量值。

1 个答案:

答案 0 :(得分:0)

我想我自己解决了这个问题。我在类的构造函数中创建了一个线程。此外,初始化self等函数中使用的speed变量似乎很重要。重写的代码是

class VS():
def __init__(self):
    #code to initialise bus
    self.message = bus.recv() #to receive 1 message
    self.t = Thread(target = self.speed, args = ())
    self.t.start()

def speed(self):
    while True:
        self.message = bus.recv()
        return self.message[1], self.message.timestamp