Python学习总结之四 多进程

一:启动多进程

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---')

你可能感兴趣的:(Python学习总结之四 多进程)