Python多任务(六)-----2种进程同步技术 Lock、Event 详解

进程同步技术

  • 在需要协同工作完成大型任务时,多个进程间同步非常重要。
  • 进程同步方法与线程同步方法类似,代码稍微修改一些即可。
  • 注意:进程同步和线程同步中Event对象的is_set()方法isSet()方法名不同,功能相同

Lock对象

  • 互斥锁 Lock 对象 是比较低级的同步原语,当被锁定以后不属于特定的线程。
  • 一个锁有两种状态:locked 和 unlocked。
    • acquire()方法:上锁操作
      • 如果锁处于 unlocked 状态,acquire()方法将其修改为 locked 状态并立即返回。
      • 如果锁处于 locked 状态,则堵塞当前线程并等待其他线程释放解锁,然后将其修改为 locked 状态并立即返回。
    • release()方法:解锁操作
      • release() 方法用来将锁的状态由 locked 修改为 unlocked 状态并立即返回。
      • 如果锁的状态本身是 unlocked 状态,调用该方法会抛出异常
          # 导入multiprocessing模块
          import multiprocessing
                  
          # 创建互斥锁
          mutex = multiprocessing.Lock()
                  
          # 锁定操作(调用acquire方法)
          mutex.acquire()
                  
          # 释放解锁(调用release方法)
          mutex.release()
      
    • 使用示例:
    import multiprocessing
    
    def text(name,m):
        # 上锁
        m.acquire()
        print(name + ":Ok!")
        # 释放解锁
        m.release()
    
    if __name__ == "__main__":
        print("---start---")
        # 创建Lock对象
        mutex = multiprocessing.Lock()
        jobs = []
        for i in range(5):
            j = multiprocessing.Process(target=text, args=(str(i),mutex))
            jobs.append(j)
            j.start()
        for j in jobs:
            j.join()
        print("--- end ---")
        
    运行结果:
    ---start---
    0:Ok!
    1:Ok!
    2:Ok!
    3:Ok!
    4:Ok!  
    --- end ---
    

Event对象

  • **Event 对象一种简单的线程通信技术,一个线程设置Event对象,另一个线程等待Event对象。
  • 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False。wait()方法阻塞,直到标志为True。该标志初始为False
  • Event 对象中的方法如下:
    • is_set()方法
      • 注意:线程同步技术中的该方法为isSet()
      • 当且仅当内部标志为True时返回True
    • set()方法:
      • 将内部标志设置为True。所有等待它成为True的线程都被唤醒。当标志保持在True的状态时,线程调用wait()是不会阻塞的。
    • clear()方法:
      • 将内部标志重置为False。随后,调用wait()的线程将阻塞,直到另一个线程调用set()将内部标志重新设置为True。
    • wait(timeout=None)方法:
      • 阻塞直到内部标志为真。如果内部标志在wait()方法调用时为True,则立即返回。否则,则阻塞,直到另一个线程调用set()将标志设置为True,或发生超时。
      • 该方法总是返回True,除非设置了timeout并发生超时。
import multiprocessing


def text(name, e):
    if e.is_set():
        e.wait()
        print(name + ":Ok!")
        e.clear()
    else:
        print(name + ":NO!")
        e.set()


if __name__ == "__main__":
    print("---start---")
    # 创建Event对象
    event = multiprocessing.Event()
    # 将event对象的内部标志设置为True
    event.set()
    jobs = []
    for i in range(5):
        multiprocessing.Process(target=text, args=(str(i), event)).start()

你可能感兴趣的:(Python多任务)