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

Python 我是否在两个线程中都锁定代码?,python,multithreading,python-3.x,locking,Python,Multithreading,Python 3.x,Locking,线程编程和使用锁的新手 所以我有两个线程,一个从COM端口读取vlaues,另一个控制步进电机 一条心 (我需要防止对stepperb的更改导致最后一行出现被零除的错误) 在从COM端口读取值的另一个线程中 我需要在哪里(以及什么类型的锁)?第一个线程是时间敏感的,因此需要有优先级 问候 Simon您必须锁定任何一系列的访问,这些访问期望stepperb\u值在该系列中不会改变。在您的情况下,这将是您张贴的整个电机控制块。类似地,您应该在COM端口线程中将整个赋值锁定到stepperb_valu

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

一条心

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

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

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

问候


Simon

您必须锁定任何一系列的访问,这些访问期望
stepperb\u值在该系列中不会改变。在您的情况下,这将是您张贴的整个电机控制块。类似地,您应该在COM端口线程中将整个赋值锁定到
stepperb_value
,以确保写入是原子的,并且在第一个线程持有锁时不会发生(并且希望值不会更改).

您必须锁定任何一系列希望
stepperb\u值在该系列中不会更改的访问。在您的情况下,这将是您张贴的整个电机控制块。类似地,您应该在COM端口线程中锁定对
stepperb_值的整个赋值,以确保写入是原子的,并且不会在第一个线程持有锁时发生(并且期望值不会更改)。

好吧,您的关键变量是
stepperb_值
,因此这就是应该“保护”的内容:

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


好吧,您的关键变量是
stepperb\u值
,所以这就是应该“保护”的内容:

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


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

正如CPython所拥有的那样,分配是原子的。因此,在使用马达控制线程之前,可以将
stepperb_值
拉入一个局部变量,并使用局部变量而不是全局变量


请注意,这里将使用一个实现细节。您的代码可能无法在其他python实现(如Jython或IronPython)上安全运行。即使在CPython上,这种行为将来也可能会改变,但我认为GIL在python5或其他东西出现之前不会消失。

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

正如CPython所拥有的那样,分配是原子的。因此,在使用马达控制线程之前,可以将
stepperb_值
拉入一个局部变量,并使用局部变量而不是全局变量


请注意,这里将使用一个实现细节。您的代码可能无法在其他python实现(如Jython或IronPython)上安全运行。即使在CPython上,行为在将来也可能会改变,但我认为GIL在Python 5或其他东西出现之前不会消失。

我喜欢这样(因为我不必学习实现锁:),但为什么它可能不安全?一旦我将全局变量的副本复制到局部变量中,当然本地线程不能被其他线程操作更改?@SimpleSi:这可能是不安全的,因为赋值是原子的(将全局值复制到本地值是原子的)是CPython的一个实现细节,而不是语言保证。由你决定,但我不认为“我不必学习实现锁”是个好主意——好的程序员知道多线程问题,知道如何编写安全代码。我不是一个好的程序员:)好的,然后我将尝试正确地执行此操作:)我需要什么类型的锁记住我不介意延迟thread2,所以我希望thread1具有任何可用的优先级。@Simples问题是,一旦thread1获得锁,thread2将无法从thread1中移除它。因此,基本上最好采取与我所描述的相同的措施,并通过锁围绕从/到局部变量的赋值。除此之外,看看盖伊的答案,排队是一个可行的选择!我喜欢这样(因为我不必学习实现锁:),但为什么它可能不安全?一旦我将全局变量的副本复制到局部变量中,局部变量肯定不会被其他线程操作更改?@SimpleSi:这可能不安全,因为赋值是原子的(将全局值复制到本地值是原子的)是CPython的一个实现细节,而不是语言保证。由你决定,但我不认为“我不必学习实现锁”是个好主意——好的程序员知道多线程问题,知道如何编写安全代码。我不是一个好的程序员:)好的,然后我将尝试正确地执行此操作:)我需要什么类型的锁记住我不介意延迟thread2,所以我希望thread1具有任何可用的优先级。@Simples问题是,一旦thread1获得锁,thread2将无法从thread1中移除它。因此,基本上最好采取与我所描述的相同的措施,并通过锁围绕从/到局部变量的赋值。除此之外,看看盖伊的答案,排队是一个可行的选择!
        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))                       
            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]))))