Python 多執行緒-同步控制 同步物件
阿新 • • 發佈:2021-01-10
當多執行緒同時開始執行的時候,是沒有先後順序的,誰先搶到執行權誰就先執行。
通過event物件可以控制執行緒優先執行權。
event=threading.Event() event.wait() # event 被設定,執行緒則阻塞不再繼續執行下去 event.set() # event 解除設定,被阻塞的執行緒可以繼續執行下去 event.clear() # 如果 event被解除設定後,需要再次設定,則需要先 clear
例子: 控制一個執行緒先執行, 當他先執行部分任務後進行阻塞等待,並且需要其他執行緒再先執行的時候,則需要使用event控制。
importthreading import time class Boss(threading.Thread): def __init__(self,thread_name): threading.Thread.__init__(self) self.thread_name=thread_name def run(self): print('%s:大家今晚需要加班'%self.thread_name) event.set() time.sleep(1) print('%s:大家可以下班了'%self.thread_name) event.set() class Worker(threading.Thread): def __init__(self,thread_name): threading.Thread.__init__(self) self.thread_name=thread_name def run(self): event.wait() print('%s:命苦啊' % self.thread_name) event.clear() event.wait()print('%s:Oh Yeah!' % self.thread_name) if __name__ == '__main__': event=threading.Event() threads=[] for i in range(5): t=Worker('woker%s'%i) threads.append(t) threads.append(Boss('boss')) for t in threads: t.start() for t in threads: t.join()
訊號控制量, 即同時可以設定有多少個執行緒執行任務
import threading import time class MyThread(threading.Thread): def __init__(self,thread_name): threading.Thread.__init__(self) self.thread_name=thread_name def run(self): if semaphore.acquire(): time.sleep(1) print(self.thread_name) semaphore.release() if __name__ == '__main__': semaphore=threading.Semaphore(5) threads=[] for i in range(100): t=MyThread('thread%s'%i) threads.append(t) for t in threads: t.start() for t in threads: t.join()