一:启动多进程
1.1 multiprocessing是一个跨平台的python包,因此我们使用该工具包进行多进程的开发.
from multiprocessing import Process
#子进程需要执行的代码
def run(str):
while True:
# os.getpid()获取当前进程id号
# os.getppid()获取当前进程的父进程id号
print(" %s--%s--%s"%(str, os.getpid(),os.getppid()))
sleep(1)
#创建子进程
#target说明进程执行的任务
p = Process(target=run, args=("test",))
#启动进程
p.start()
#父进程的结束不能影响子进程,让父进程等待子进程结束再执行父进程
process.join()
1.2利用进程池生成进程.
开多进程是为了并发,通常有几个cpu核心就开几个进程,但是进程开多了会影响效率,主要体现在切换的开销,所以引入进程池限制进程的数量。
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,初始化一个Pool时,可以指定一个最大进程数,如果超过这个数,那么请求就会等待,直到池中有进程结束,才会创建新的进程来执行
from multiprocessing import Pool
import os, time, random
def run(name):
print("子进程%d启动--%s" % (name, os.getpid()))
if __name__ == "__main__":
#创建多个进程
#进程池
#表示可以同时执行的进程数量
#Pool默认大小是CPU核心数
pp = Pool(2)
for i in range(3):
#创建进程,放入进程池同意管理
pp.apply_async(run,args=(i,))
#在调用join之前必须先调用close,调用close之后就不能再继续添加新的进程了
pp.close()
#进程池对象调用join,会等待进程池中所有的子进程结束完毕再去执行父进程
pp.join()
二,多进程之间的通信.
进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。
2.1进程队列queue
from multiprocessing import Process, Queue
import os, time
def write(q):
print("启动写子进程%s" % (os.getpid()))
q.put("A")
print("结束写子进程%s" % (os.getpid()))
def read(q):
print("启动读子进程%s" % (os.getpid()))
while True:
value = q.get(True)
print("value = " + value)
print("结束读子进程%s" % (os.getpid()))
if __name__ == "__main__":
#父进程创建队列,并传递给子进程
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
pr.start()
pw.join()
#pr进程里是个死循环,无法等待其结束,只能强行结束
pr.terminate()
print("父进程结束")
2.2进程池中的Queue
如果使用进程池pool创建进程的话,就需要使用Manager().Queue()
from multiprocessing import Manager, Process, Pool
import threading
import random, time,os
# queue,实现多进程之间的数据传递,其实就是个消息队列
def write(q):
print('---write thread is %s' % os.getpid())
for value in ['A', 'B', 'C']:
print("put %s to queue" % value)
q.put(value)
def read(q):
print('---read thread is %s' % os.getpid())
for i in range(q.qsize()):
print("Get value is %s" % q.get(True))
if '__main__' == __name__:
print('---main thread is %s' % os.getpid())
q = Manager().Queue()
po = Pool()
po.apply(write, args=(q,))
po.apply(read, args=(q,))
po.close()
po.join()
print('---end---')