0

线程编程和使用锁的新手所以我有 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))                       

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

在另一个从 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]))))

我需要在哪里(以及什么样的锁) - 第一个线程是时间敏感的,因此需要优先级

问候

西蒙

4

3 回答 3

2

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

于 2013-02-02T10:51:20.110 回答
2

好吧,您的关键变量是stepperb_value应该“保护”的:

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

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

于 2013-02-02T11:01:36.337 回答
2

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

由于 CPython 具有Global Interpreter Lock,因此分配是原子的。因此,您可以在使用之前在电机控制线程中拉stepperb_value入一个局部变量,并使用局部变量而不是全局变量。

请注意,您将在此处使用实现细节。您的代码可能无法在其他 python 实现(例如 Jython 或 IronPython)上安全运行。即使在 CPython 上,这种行为将来也可能会发生变化,但我认为 GIL 在 Python 5 或其他版本之前不会消失。

于 2013-02-02T11:14:13.473 回答