Python多进程与进程锁的基本使用

Python的multiprocessing模块提供了多种进程间通信的方式,如Queue、Pipe等。

Queue是multiprocessing提供的一个模块,它的数据结构就是"FIFO——first in first out"的队列,常用的方法有:put(object)入队;get()出队;empty()判断队列是否为空。

Lock:当多个子进程对同一个queue执行写操作时,为了避免并发操作产生冲突,可以通过加锁的方式使得某个子进程对queue拥有唯一的写权限,其他子进程必须等待该锁释放后才能再开始执行写操作。

下面就是使用Queue进行进程间通信的代码:在父进程里创建两个子进程,分别实现对queue的读和写操作:

#!/usr/bin/python
# -*- coding: utf-8 -*
__author__ = 'zni.feng'
import  sys
reload (sys)
sys.setdefaultencoding('utf-8')
from multiprocessing import Process, Queue, Lock
import os, time, random
#写数据进程
def write(q, lock, name):
    print 'Child Process %s starts' % name
    #获得锁
    lock.acquire()
    for value in ['A' , 'B', 'C']:
        print 'Put %s to queue...' % value
        q.put(value)
        time.sleep(random.random())
    #释放锁
    lock.release()
    print 'Child Process %s ends' % name

#读数据进程
def read(q, lock, name):
    print 'Child Process %s starts' % name
    while True: #持续地读取q中的数据
        value =q.get()
        print 'Get %s from queue.' % value
    print 'Child Process %s ends' % name

if __name__ == "__main__":
    #父进程创建queue,并共享给各个子进程
    q= Queue()
    #创建锁
    lock = Lock()
    #创建第一个“写”子进程
    pw = Process(target = write , args=(q, lock, 'WRITE', ))
    #创建“读”进程
    pr = Process(target = read, args=(q,lock, 'READ',))
    #启动子进程pw,写入:
    pw.start()
    #启动子进程pr,读取:
    pr.start()
    #等待pw结束:
    pw.join()
    #pr是个死循环,通过terminate杀死:
    pr.terminate()
    print 'Test finish.'

运行结果:

Child Process WRITE starts
Put A to queue...
Child Process READ starts
Get A from queue.
Put B to queue...
Get B from queue.
Put C to queue...
Get C from queue.
Child Process WRITE ends
Test finish.
[Finished in 2.0s]


Pipe是另一种进程间通信的方式,俗称“管道”。它由两端组成,一端往管道里写入数据,另一端从管道里读取数据。

下面就是使用Pipe通信的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*
__author__ = 'zni.feng'
import  sys
reload (sys)
sys.setdefaultencoding('utf-8')
from multiprocessing import Process, Pipe
import os, time, random

#发送数据进程
def send(child_pipe, name):
    print 'Child Process %s starts' % name
    child_pipe.send('This is Mr.Ni')
    child_pipe.close()
    time.sleep(random.random())
    print 'Child Process %s ends' % name

#接收数据进程
def recv(parent_pipe, name):
    print 'Child Process %s starts' % name
    print parent_pipe.recv()
    time.sleep(random.random())
    print 'Child Process %s ends' % name

if __name__ == "__main__":
    #创建管道
    parent,child = Pipe()
    #创建send进程
    ps = Process(target=send, args=(child, 'SEND'))
    #创建recv进程
    pr = Process(target=recv, args=(parent, 'RECEIVE'))
    #启动send进程
    ps.start()
    #等待send进程结束
    ps.join()
    #启动recv进程
    pr.start()
    #等待recv进程结束
    pr.join()
    print 'Test finish.'

运行结果:

Child Process SEND starts
Child Process SEND ends
Child Process RECEIVE starts
This is Mr.Ni
Child Process RECEIVE ends
Test finish.
[Finished in 1.8s]
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值