Python多进程之multiprocessing模块和进程池的实现

一、利用multiprocessing能够在主进程中建立子进程,提高效率,下面是multiprocessing建立进程的简单例子,和多线程的使用很是类似
'''
代码是由主进程里面的主线程从上到下执行的,
咱们在主线程里面又建立了两个子进程,子进
程里面也是子线程在干活,这个子进程在主进
程里面
'''
import multiprocessing
import time

def f0(a1):
    time.sleep(3)
    print(a1)
if __name__ == '__main__':#windows下必须加这句

    t = multiprocessing.Process(target=f0,args=(12,))
    t.daemon=True#将daemon设置为True,则主线程不比等待子进程,主线程结束则全部结束
    t.start()

    t2 = multiprocessing.Process(target=f0, args=(13,))
    t2.daemon = True
    t2.start()

    print('end')#默认状况下等待全部子进程结束,主进程才结束

  这里的结果是直接打印出end就结束了,由于添加了t.daemon=True,join方法在进程里面也能够用,跟线程的用法很是类似python

二、进程之间默认是不能共用内存的windows

li = []

def f1(i):
    li.append(i)
    print('你好',li)

if __name__ =='__main__':#进程不能共用内存
    for i in range(10):
        p = Process(target=f1,args=(i,))
        p.start()

'''每一个进程都建立一个列表,而后添加一个因素进去,
   每一个进程之间的数据是不能共享的

  结果如图数组

若是将代码改为threading,因为线程共用内存,因此结果是不同的,线程操做列表li以前,拿到的是前一个线程操做过的li列表,如图多线程

三、若是要进程之间处理同一个数据,能够运用数组以及进程里面的manager方法,下面代码介绍的是manager方法app

 

from multiprocessing import Process
from multiprocessing import Manager



def f1(i,dic):
    dic[i] = 200+i
    print(dic.values())

if __name__ =='__main__':#进程间默认不能共用内存
    manager = Manager()
    dic = manager.dict()#这是一个特殊的字典


    for i in range(10):
        p = Process(target=f1,args=(i,dic))
        p.start()
        p.join()

  这里输出如图,表示每一个进程都是操做这个字典,最后的输出是有10个元素异步

若是是普通的字典,输出如图async

 

四、multiprocessing模块里面的进程池Pool的使用函数

(1)apply模块的使用,每一个任务是排队执行的线程

from multiprocessing import Process,Pool
from multiprocessing import Manager
import time


def f1(a):
    time.sleep(2)
    print(a)

if __name__ =='__main__':
    pool =Pool(5)
    for i in range(5):#每次使用的时候会去进程池里面申请一个进程
        pool.apply(func=f1,args=(i,))
        print('你好')#apply里面是每一个进程执行完毕了才执行下一个进程
    pool.close()#执行完close后不会有新的进程加入到pool,join函数等待全部子进程结束
    pool.join()#等待进程运行完毕,先调用close函数,不然会出错

  运行结果如图blog

(2)apply_async模块,会比apply模块多个回调函数,同时是异步的

from multiprocessing import Process,Pool
from multiprocessing import Manager
import time



def Foo(i):
    time.sleep(1)
    return i+50

def Bar(arg):
    print(arg)

if __name__ =='__main__':
    pool = Pool(5)
    for i in range(10):

        '''apply是去简单的去执行,而apply_async是执行完毕以后能够执行一
        个回调函数,起提示做用'''
        pool.apply_async(func=Foo,args=(i,),callback=Bar)#是异步的
        print('你好')
    pool.close()#不执行close会报错,由于join的源码里面有个断言会检验是否执行了该方法
    pool.join()#等待全部子进程运行完毕,不然的话因为apply_async里面daemon是设置为True的,主进程不会等子进程,所欲函数可能会来不及执行完毕就结束了
'''apply_async里面,等函数Foo执行完毕,它的返回结果会被当作参数
    传给Bar'''

  结果如图

这两个方法的主要区别如图

相关文章
相关标签/搜索