Python多线程同步

同步条件(Event)

在Python中,多线程同步可以通过threading模块中的Event对象来实现。Event对象允许一个或多个线程等待某个事件的发生,当事件发生时,等待的线程将被唤醒。

event.isSet():返回event的状态值
event.wait():如果 event.isSet()==False,将阻塞线程触发event.wait()
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待执行
event.clear():恢复event的状态值为False
import threading
import time

class Techer(threading.Thread):
    def run(self):
        print('开始考试')
        event.set()  #设置为真
        print('techer event',event.isSet())
        time.sleep(1)
        print('考试结束')
        event.set()


class Student(threading.Thread):
    def run(self):
        event.wait()  #此时阻塞,等待event设置为真
        print('考试中')
        time.sleep(1)
        event.clear() #event恢复初始状态
        print('student event',event.isSet())
        event.wait()  #等待考试结束的指令
        print('终于考完了')


if __name__=='__main__':
    event=threading.Event()  #定义一个Event对象  初始event对象 的状态为False 当Event.wait()则会阻塞等待Event.isSet()对象为True
    print('主线程 event',event.isSet())

    threads=[]

    for i in range(1):
        threads.append(Student())  #定义Student线程
    threads.append(Techer())

    for t in threads:
        t.start()
    for t in threads:
        t.join()  #阻塞

    print('主线程结束')

信号量(Semaphore)

信号量(Semaphore)是一种用于多线程同步的机制,它可以用来控制对共享资源的访问。信号量是一个非负整数值,通常用于表示可用资源的数量。

Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。

import threading
import time

semaphore = threading.Semaphore(5)

def func():
    if semaphore.acquire():
        print (threading.currentThread().getName() + '获取共享资源')
        time.sleep(2)
        semaphore.release()

for i in range(10):
  t1 = threading.Thread(target=func)
  t1.start()

Python多线程同步_第1张图片

你可能感兴趣的:(开发语言)