Python需要线程化某个函数

时间:2016-04-08 03:48:41

标签: python multithreading python-3.x raspberry-pi2

首先,我想提一下我一直在看视频,并尽力了解如何使线程工作,但我无法弄清楚。我希望有人可以在我的特殊情况下为我工作,我可以从中学习,或者至少让它对我有用。

我希望start_timer函数是一个线程进程,因此用户在运行此函数时仍然可以激活其他函数。

最终每个功能都会与tkinter中的一个按钮相关联,并将信息发送到我的覆盆子pi以控制我的花园浇水。

这是我的代码:

import time


class Valve:

    def __init__(self, pin, location):
        self.pin = pin
        self.location = location

    timer = 0
    status = False

    def turn_on(self):
        self.status = True
        self.send_info()

    def turn_off(self):
        self.status = False
        self.send_info()

    def set_timer(self, minutes):
        self.timer = minutes * 60

    def start_timer(self):
        self.turn_on()
        self.status = True
        while self.timer > 0:
            print(self.timer)
            self.timer -= 1
            time.sleep(1)
        self.turn_off()


    def send_info(self):
        print("sending this info to server:", self.pin, self.status)

hose1 = Valve(1, 'Garden')
hose2 = Valve(2, 'Lawn')


hose1.set_timer(1)

hose1.start_timer()

hose2.turn_on()

我认为用下面的方法替换hose1.start_timer()会有效但是在执行hose2.turn_on()之前它仍会运行这个洞进程。

thread = threading.Thread(target=hose1.start_timer(), args=hose1.timer)
thread.start()

感谢能为我工作的人!

此外,如果有人对这个项目感兴趣,我很乐意让合作伙伴在创作过程中来回反复思考。

1 个答案:

答案 0 :(得分:0)

你正在调试你的错误。

您需要使用

thread = threading.Thread(target=hose1.start_timer, args=(hose1.timer, ))

thread = threading.Thread(target=lambda: hose1.start_timer(), args=(hose1.timer,))

如果您希望线程在程序执行时退出,因为这是tkinter,那很可能是根窗口。

您可以使用thread.daemon = True将该主题设置为守护程序,然后您可以调用thread.start()