1. 程式人生 > 實用技巧 >Python 多執行緒-同步控制 同步物件

Python 多執行緒-同步控制 同步物件

當多執行緒同時開始執行的時候,是沒有先後順序的,誰先搶到執行權誰就先執行。

通過event物件可以控制執行緒優先執行權。

  

event=threading.Event()

event.wait()   # event 被設定,執行緒則阻塞不再繼續執行下去
event.set()    # event 解除設定,被阻塞的執行緒可以繼續執行下去
event.clear()  # 如果 event被解除設定後,需要再次設定,則需要先 clear

例子: 控制一個執行緒先執行, 當他先執行部分任務後進行阻塞等待,並且需要其他執行緒再先執行的時候,則需要使用event控制。

import
threading 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()