2022年 11月 7日

python线程间通信

"""
线程通信方法: 利用同步互斥机制(都是对共享资源的操作)
        多个线程对共享资源的操作代码称为临界区
        同步是一种协作关系,未完成操作,多进程或者线程之间形成一种协调,按照必要步骤有序执行操作
        互斥是一种制约关系,当一个进程或者线程占有资源是会进行加锁处理,其他的线程无法操作该资源,直到解锁
    Event:
        1.创建event对象             e=Event()
        2.阻塞等待对象被set          e.wait([timeout])
        3.设置对象,使wait结束阻塞    e.set()
        4.使对象回到未被设置状态       e.clear()
        5.查看对象是否被设置          e.is_set()
    Lock:
        1.创建锁对象         lock=Lock()
        2.上锁              lock.acquire() 阻塞操作:再次调用到lock.acquire时是阻塞状态
        3.解锁              lock.release()
    with lock : 上锁
            ...
            with代码块结束自动解锁
"""
from threading import Thread, Event
from threading import Lock


def event_():
    # 设置全局变量用来通信
    num = None
    # 创建event对象
    e = Event()

    def fun():
        print("请问你是大刀王老五吗\n")
        global num
        num = 1
        # 结束wait的阻塞(该线程运行完成结束阻塞)
        e.set()

    # 创建线程对象,并关联函数
    t = Thread(target=fun)
    # 开启线程
    t.start()
    # 开启阻塞等待上面线程完成
    e.wait()
    if num == 1:
        print("原来你就是大刀王老五")
    else:
        print("你不是王老五,你到底是谁?")

    # 回收线程
    t.join()


def lock_():
    a = b = 1
    lock = Lock()

    def val():
        while True:
            # 上锁,再次运行到这里就阻塞
            lock.acquire()
            if a != b:
                print("a=%d,b=%d" % (a, b))
            else:
                print("a=b")
            # 解锁
            lock.release()

    t = Thread(target=val)
    t.start()
    while True:
        # 上锁,运行结束解锁
        with lock:
            a += 1
            b += 1

lock_()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75