Python多进程编程-进程间协作(Queue、Lock、Semaphore、Event、Pipe)

本文介绍了Python中多进程间的协作方式,包括使用Lock进行加锁、Semaphore实现信号量、Queue作为通信队列、Event处理事件触发以及Pipe进行管道通信。通过实例代码展示了各种协作机制的用法及其效果。
摘要由CSDN通过智能技术生成

进程与进程之间是相互独立的,互不干扰。如果多进程之间需要对同一资源操作,就需要进程间共享变量,上一篇文章介绍了进程间共享数据的三大类Value、Array、Manager,这三种类的主要区别在于管理的数据类型不同。解决了进程间共享数据的问题,又有新的问题产生,那就是当多进程同时对一个共享资源进行写操作时,容易造成数据混乱。如何解决这一问题呢?这就需要进程间相互协同。
进程间相互协同的方式有如下几种:
Lock:加锁,accquire()申请锁,release()释放锁
Queue:队列
Semaphore:信号量
Event:事件
Pipe:管道
下面一一介绍这几种方式。
Lock:进程申请锁后,会阻塞其他进程获取lock对象,不能操作数据,只有锁释放后,其他进程可以重新获取锁对象。
实例代码:

from multiprocessing import Process,Value,Lock
def func1(num,lock):#传入的lock对象
    lock.acquire()#申请锁,lock对象变为locked,并且阻塞其他进程获取lock对象
    print num.value
    num.value+=1
    lock.release()#释放锁,lock对象变为unlocked,其他进程可以重新获取lock对象
if __name__ == '__main__':
    lock=Lock()#创建锁对象
    val=Value('i',0)
    proc=[Process(target=func1,args=(val,lock)) for i in xrange(100)]
    for p in proc:
        p.start()
    for p in proc:
        p.join()

    print val.value

运行结果:

50

Semaphore:信号量,同时允许多个进程申请锁
实例代码:

import multiprocessing
import time
from multiprocessing import Process,Semaphore
def func1(s):
    s.acquire()
    print multiprocessing.current_process().name+'acquire'
    time.sleep(10)
    s.release()
    print multiprocessing.current_process().name+'release'
if __name__ == '__main__':
    s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值