我是否在两个线程中锁定代码



线程编程和使用锁的新手所以我有 2 个线程 - 一个从 COM 端口读取 vlaues - 另一个控制步进电机

在一个线程中

        if stepperb_value != 0: #if stepperb non-zero
            if stepperb_value > 0: # if positive value
                self.step_fine(10,11,12,13,step_delay) #step forward
            else:
                self.step_fine(13,12,11,10,step_delay) #step backwards
            if abs(stepperb_value) != 100:
                time.sleep(10*step_delay*((100/abs(stepperb_value))-1))                       

(我需要防止对步进器的更改导致最后一行被零错误除以)

在从 COM 端口读取值的另一个线程中

            if 'stepperb' in dataraw:
                outputall_pos = dataraw.find('stepperb')
                sensor_value = dataraw[(1+outputall_pos+len('stepperb')):].split()
                print "stepperb" , sensor_value[0]
                if isNumeric(sensor_value[0]):
                    stepperb_value =  int(max(-100,min(100,int(sensor_value[0]))))

我需要在哪里(以及哪种锁)-第一个线程对时间敏感,因此需要具有优先级

问候

西蒙

如果你只使用CPython,你还有另一种可能性(目前)。

由于CPython具有全局解释器锁,因此分配是原子的。因此,您可以在使用电机控制线程中的局部变量之前将其拉入stepperb_value,并使用局部变量而不是全局变量。

请注意,您将在此处使用实现详细信息。您的代码可能无法在其他 python 实现(如 Jython 或 IronPython)上安全运行。即使在CPython上,行为将来也可能会改变,但我没有看到GIL在Python 5或其他东西之前消失。

您将不得不锁定任何期望stepperb_value不会在该系列中更改的访问系列。 在您的情况下,这将是您发布的整个电机控制块。 同样,应锁定要在 COM 端口线程中stepperb_value的整个赋值,以确保写入是原子的,并且在第一个线程持有锁(并期望值不会更改)时不会发生。

好吧,你的临界变量是stepperb_value的,所以这就是应该"保护"的:

我建议您使用队列来处理所有同步问题(使用者/生产者模式)。此外,事件和条件也可以是一个合适的解决方案:

http://www.laurentluce.com/posts/python-threads-synchronization-locks-rlocks-semaphores-conditions-events-and-queues/

最新更新