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()
答案 0 :(得分:1)
不,你这里不需要锁。 Event
的重点是它是一个同步标志。
话虽这么说,你的代码有竞争,而锁也无济于事 - 但无论如何它可能就是你想要的。
在此代码中:
if not self.cont_flag.is_set() :
print('pause\n' * 10)
self.cont_flag.wait()
...完全有可能设置标志,然后在is_set
和wait
之间再次清除。在这种情况下,你最终会等到标志再次被设置。
但是,除非你想保证循环每次继续运行至少一次(无论你多久重新暂停),或者每次暂停都会打印出“暂停”(无论你多快 - 继续并重新停顿),这可能就是你想要发生的事情。
如果您想消除该种族,您可能需要Condition
和常规bool变量,而不是Event
。虽然事件非常简单,但它们也很难组成任何不那么简单的东西......