Python同步子类线程

首先,我是threadingPython 的新手,实际上对 Python 来说还很陌生,所以如果问题问得不好,请原谅。


我有 2 个模块,每个模块包含一个类。这些类都是threading.Thread. 我从第三个模块启动这两个线程main.py:


from controller import Controller

from server import Server

from ultrasonic import Ultrasonic


if __name__ == "__main__":

    controller = Controller()


    server = Server(controller)

    server.start()


    ultrasonic = Ultrasonic(controller)

    ultrasonic.start()

如您所见,两个线程都访问不同模块中的另一个类,Controller. 为了确保这两个线程在调用 的方法时不会发生干扰Controller,我想同步这些线程。我看到,有 using 的选项threading.Lock,但我不确定如何在我的特定情况下使用threading.Thread不同模块中的不同子类来实现它。


我希望你们能帮助我。谢谢!


编辑:类 中的方法Controller如下所示:


def stop(self):

    GPIO.output(self.LEFT_PIN1, False)

    GPIO.output(self.LEFT_PIN2, False)

    GPIO.output(self.RIGHT_PIN1, False)

    GPIO.output(self.RIGHT_PIN2, False)

我认为如果 GPIO 引脚收到相反的信号可能会导致问题。如果不是这种情况,那么我一开始就不需要同步线程。


扬帆大鱼
浏览 82回答 1
1回答

杨__羊羊

我的猜测是您的 Controller 类可以创建一个Lock:from Threading import Lockclass Controller:    lock = Lock()    # class level instance    def stop(self):        Controller.lock.acquire()        GPIO.output(self.LEFT_PIN1, False)        GPIO.output(self.LEFT_PIN2, False)        GPIO.output(self.RIGHT_PIN1, False)        GPIO.output(self.RIGHT_PIN2, False)        Controller.lock.release()这样 Controller 类Lock在定义时创建一个单一的。当对 进行任何调用时stop(),当前线程acquires锁定并在返回时释放它。进入调用的任何其他线程都会acquire()阻塞,直到第一个线程释放它。更好的是使用上下文管理和with声明:    def stop(self):        with Controller.lock:            GPIO.output(self.LEFT_PIN1, False)            GPIO.output(self.LEFT_PIN2, False)            GPIO.output(self.RIGHT_PIN1, False)            GPIO.output(self.RIGHT_PIN2, False)请注意,我Lock在课堂级别使用了 a,因为您锁定了GPIO对处理器引脚的访问权限,并且只有一组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python