Python多进程multiprocessing模块介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多进程multiprocessing模块介绍相关的知识,希望对你有一定的参考价值。

参考技术A

multiprocessing 是一个支持使用与 threading 模块类似的 API 来产生进程的包。 multiprocessing 包同时提供了本地和远程并发操作,通过使用子进程而非线程有效地绕过了 全局解释器锁。 因此,multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。 它在 Unix 和 Windows 上均可运行。

1、multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs=, *, daemon=None)

2、相关方法

输出结果如下:

Pool提供了一种快捷的方法,赋予函数并行化处理一系列输入值的能力,可以将输入数据分配给不同进程处理(数据并行)。下面的例子演示了在模块中定义此类函数的常见做法,以便子进程可以成功导入该模块。这个数据并行的基本例子使用了 Pool 。

将在标准输出中打印

其中:

(1)p.apply(func [, args [, kwargs]]):在一个池工作进程中执行func( args, kwargs),然后返回结果。需要强调的是:此操作并不会在所有池工作进程中并执行func函数。如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async()
(2)p.apply_async(func [, args [, kwargs]]):在一个池工作进程中执行func(
args,**kwargs),然后返回结果。此方法的结果是 AsyncResult类的实例,callback是可调用对象,接收输入参数。当func的结果变为可用时,将理解传递给callback。callback禁止执行任何阻塞操作,否则将接收其他异步操作中的结果。多进程并发!
(3)p.close():关闭进程池,防止进一步操作。如果所有操作持续挂起,它们将在工作进程终止前完成
(4)p.jion():等待所有工作进程退出。此方法只能在close()或teminate()之后调用

Python多进程multiprocessing

紧接上文

在上文Python多进程multiprocessing(一)中我们介绍了多进程multiprocessing的部分基础操作,在本文中,我们将继续介绍关于多进程的一些知识,比如进程池Pool这个有用的东东。马上开始吧!

使用实例

实例1

import multiprocessing as mp


def job(x):
    return x*x

def multicore():
    pool = mp.Pool(processes=2)
    res = pool.map(job,range(10))
    print(\'map res:\',res)

    multi_res = [pool.apply_async(job,(i,)) for i in range(10)]
    print(\'apply_async res:\',[res.get() for res in multi_res])

if __name__ == \'__main__\':
    multicore()

运行结果:

map res: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
apply_async res: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

解释一下:

  1. 这个例子演示了进程池pool的用法,创建Pool对象并指定使用2个核(默认使用全部)。
  2. 之前我们定义任务的时候是不能有return的,pool的map方法可以将任务依次作用到数据上去。
  3. 另一个类似map的方法是apply_async,但是注意这里传入的参数需要是可迭代的。

实例2

在多线程threading中,我们可以使用global全局变量来共享某个变量,但是在多进程中这是行不通的,我们需要用到共享内存shared memory的形式,具体做法如下:

import multiprocessing as mp

value = mp.Value(\'d\', 3.14)
array = mp.Array(\'i\', [1,2,3])

解释一下:

  1. 这里展示了两种共享内存的形式,一个是Value,一个是Array(其实就是list)
  2. 要注意的是,在定义值的同时需要指定数值类型,比如整型"i",双浮点型"d",详细的见下表:
Type code C Type Python Type Minimum size in bytes
\'b\' signed char int 1
\'B\' unsigned char int 1
\'u\' Py_UNICODE Unicode character 2
\'h\' signed short int 2
\'H\' unsigned short int 2
\'i\' signed int int 2
\'I\' unsigned int int 2
\'l\' signed long int 4
\'L\' unsigned long int 4
\'q\' signed long long int 8
\'Q\' unsigned long long int 8
\'f\' float float 4
\'d\' double float 8

(更详细的来源)

实例3

import multiprocessing as mp

def job(v,num):
    v.value += num
    print(v.value)

def multicore():
    v = mp.Value(\'i\', 0)
    p1 = mp.Process(target=job,args=(v,1))
    p2 = mp.Process(target=job,args=(v,10))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == \'__main__\':
    multicore()

运行结果:

1
11

解释一下:

  1. 这就是使用共享内存的作用,两次任务执行是累加的
  2. 在调用共享内存值的时候需要使用.value

实例4

import multiprocessing as mp

def job(v,num,l):
    l.acquire()
    for i in range(10):
        v.value += num
        print(v.value)
    l.release()

def multicore():
    l = mp.Lock()
    v = mp.Value(\'i\', 0)
    p1 = mp.Process(target=job,args=(v,1,l))
    p2 = mp.Process(target=job,args=(v,10,l))
    p1.start()
    p2.start()
    p1.join()
    p2.join()


if __name__ == \'__main__\':
    multicore()

运行结果:

1
2
3
4
5
6
7
8
9
10
20
30
40
50
60
70
80
90
100
110

解释一下:

  1. 这里演示了Lock的使用,其实用法与多线程的lock一样,也是使用acquire和release方法来控制。
  2. 注意,需要把lock对象作为参数一起传入process里。

小结

多进程multiprocessing的部分就到这里,再加上之前分享的多线程threading,大家应该有了一些直观的印象,什么时候使用多线程多进程,以及使用哪一个还是一起使用都是要看具体任务的。那么,剩下的就是去实际操作了,踩坑填坑,熟练掌握!

以上是关于Python多进程multiprocessing模块介绍的主要内容,如果未能解决你的问题,请参考以下文章

python ---多进程 Multiprocessing

python多进程-----multiprocessing包

python多进程multiprocessing

python 多进程multiprocessing 模块

python 3 编程之多进程 multiprocessing模块

Python多进程(multiprocessing)