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

 

  

 

posted @ 2021-01-10 15:59  leungqingyun  阅读(176)  评论(0编辑  收藏  举报