是否需要使用锁定?

时间:2014-02-13 20:32:15

标签: 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_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()

我的程序中有2个线程,第一个线程正在等待控制台输入,第二个线程正在执行开始会话

的方法

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

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')

所以我想知道我是否必须使用锁定:

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

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

1 个答案:

答案 0 :(得分:1)

不,你这里不需要锁。 Event的重点是它是一个同步标志。


话虽这么说,你的代码有竞争,而锁也无济于事 - 但无论如何它可能就是你想要的。

在此代码中:

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

...完全有可能设置标志,然后在is_setwait之间再次清除。在这种情况下,你最终会等到标志再次被设置。

但是,除非你想保证循环每次继续运行至少一次(无论你多久重新暂停),或者每次暂停都会打印出“暂停”(无论你多快 - 继续并重新停顿),这可能就是你想要发生的事情。


如果您想消除该种族,您可能需要Condition和常规bool变量,而不是Event。虽然事件非常简单,但它们也很难组成任何不那么简单的东西......