为了账号安全,请及时绑定邮箱和手机立即绑定

Python同步子类线程

Python同步子类线程

扬帆大鱼 2022-12-20 16:29:16
首先,我是threadingPython 的新手,实际上对 Python 来说还很陌生,所以如果问题问得不好,请原谅。我有 2 个模块,每个模块包含一个类。这些类都是threading.Thread. 我从第三个模块启动这两个线程main.py:from controller import Controllerfrom server import Serverfrom ultrasonic import Ultrasonicif __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 引脚收到相反的信号可能会导致问题。如果不是这种情况,那么我一开始就不需要同步线程。
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

我的猜测是您的 Controller 类可以创建一个Lock:


from Threading import Lock


class 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对处理器引脚的访问权限,并且只有一组。


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号