python 多进程编程

多进程指的是一个程序可以启动多个进程执行,一般模式如下:

import multiprocessing
from multiprocessing import Process,current_process
import time

# cup 核数量
num_cpus = multiprocessing.cpu_count()

def func(x):
    time.sleep(1)
    proc = current_process()
    print proc.name,"--",proc.pid,"--",x

# 创建子进程
sub_proc = Process(target = func,args = ("oyp",)) # 同多线程类似
sub_proc.start()
proc = current_process()
sub_proc.join()
print proc.name,"--",proc.pid

以上代码在主进程中创建子进程,并输出进程名和编号,等待 join 子进程执行完,再继续执行主进程的整个的执行流程。结果如下:

 

进程同步

锁是为了确保数据一致性,比如读写锁,每个进程给一个变量增加 1 ,但是如果在一个进程读取但还没有写入的时候,另外的进程也同时读取了,并写入该值,则最后写入的值是错误的,这时候就需要锁。跟多线程情况类似。

from multiprocessing import Process,Lock
def func():
    lock = Lock()
    lock.acquire()
    #do my update
    lock.release()

sub_proc = Process(target = func)
sub_proc.start()
sub_proc.join()

 

两个进程之间的通信 Pipe

from multiprocessing import Process,Pipe
#定义发送进程
def func1(pipe,y):
    for x in range(10):
        pipe.send(y+str(x))

#定义接受进程
def func2(pipe):
    while True:
        print "func2 recv %s" %pipe.recv()

pipe = Pipe(True)   # True 表示全双工, 默认或不填为单工
Process(target = func1,args = (pipe[0],"oyp",)).start() # 启动第一个进程
Process(target = func2,args = (pipe[1],)).start()       # 启动第二个进程

结果如下:

 

内存共享

在提到多线程编程的时候提到过,多进程默认是不支持内存共享的,也就是同一个变量在不同的进程中其实是不一样的,如果要使用内存共享,比较通用的一个写法是 manager ,当然其实也有别的方法实现共享:

from multiprocessing import Process,Manager
def func(dit,lst):
    dit[1] = 1
    lst.reverse()

manager = Manager()
dit = manager.dict()
lst = manager.list(range(5,10))

p = Process(target = func,args = (dit,lst,))
p.start()
p.join() # 等待子进程执行完毕再看结果
print dit,lst

 

进程池

from multiprocessing import Pool
def func(x):
    return x*x

pool = Pool(processes = 4)
print pool.map(func,range(8))  # 异步执行 print pool.map_async(func,range(8)).get()
print 输出: [0, 1, 4, 9, 16, 25, 36, 49]
pool.close()  # 不再接受新的任务
pool.join()   # 等待进程池中的进程全部结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值