Python 是否需要使用锁?

Python 是否需要使用锁?,python,multithreading,locking,Python,Multithreading,Locking,我的程序中有两个线程,第一个线程正在等待控制台输入,第二个线程正在执行类的方法 第一个线程就像会话线程上的控制面板,代码如下: class Session(list) : def __init__(self, session_file, laps_sound_file, end_sound_file, autoparse=True) : self.session_file = session_file self.laps_sou

我的程序中有两个线程,第一个线程正在等待控制台输入,第二个线程正在执行类的方法

第一个线程就像会话线程上的控制面板,代码如下:

class Session(list) :

        def __init__(self, session_file, laps_sound_file, end_sound_file, autoparse=True) :

            self.session_file = session_file
            self.laps_sound_file = laps_sound_file
            self.end_sound_file = end_sound_file

            self.cont_flag = threading.Event()
            self.cont_flag.set()

            if autoparse : self.parse()

        def start(self) :

            print("Entrainement Are going to start in : 10 sec\n" * 10)
            time.sleep(10)

            for action in self :

                if not self.cont_flag.is_set() :
                    print('pause\n' * 10)
                    self.cont_flag.wait()

                os.system('cls')

                print(str(action) * 10)
                winsound.PlaySound(self.laps_sound_file.split('.')[0], winsound.SND_FILENAME)
                time.sleep(action.time)

            winsound.PlaySound(self.end_sound_file.split('.')[0], winsound.SND_FILENAME)

        def pause(self) :
            self.cont_flag.clear()

        def cont_session(self) :
            self.cont_flag.set()
所以我想知道我是否必须在以下两者之间使用锁:

while 1 :
    command = input("enter you're command : ").strip().lower()

if command == 'exit' :
    break
elif command == 'pause' :
    sess.pause()
elif command == 'continue' :
    sess.cont_session()
else : print('invalide command, please retry')


不,这里不需要锁。
事件的关键在于它是一个同步标志


也就是说,您的代码有一个竞争,锁不会有帮助,但它可能是您想要的

在此代码中:

def pause(self) :
        self.cont_flag.clear()
…完全可以设置标志,然后在
已设置
等待
之间再次清除。在这种情况下,您将等待标志再次设置

但是,除非您想保证循环在每次继续时至少运行一次(无论您重新暂停的速度有多快),或者每次暂停时都会打印出“暂停”(无论您重新继续并重新暂停的速度有多快),否则这可能就是您想要的结果



如果要消除该竞争,可能需要一个
条件
和一个常规bool变量,而不是
事件
。虽然事件非常简单,但它们也很难组合成不那么简单的东西……

子类化
list
从来没有帮助。它通常会导致意外的、未定义的行为。最好在会话类中的列表中实现操作?是的,这是典型的。
def pause(self) :
        self.cont_flag.clear()
if not self.cont_flag.is_set() :
    print('pause\n' * 10)
    self.cont_flag.wait()