多进程指的是一个程序可以启动多个进程执行,一般模式如下:
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() # 等待进程池中的进程全部结束