Python多进程multiprocessing模块介绍

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

multiprocessing模块提供了一个Process类来代表一个进程对象

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

  • target 是函数名字,需要调用的函数
  • args 函数需要的参数,以 tuple 的形式传入
  • 将daemon设置为True时,则主线程不必等待子进程,主线程结束则所有结束

2、相关方法

  • star() 方法启动进程,
  • join() 方法实现进程间的同步,等待所有进程退出。
  • close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。、
from multiprocessing import Process
import os
 
def run_proc(name):
    print('Run child process %s (%s)...' % (name, os.getpid()))
 
if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    p = Process(target = run_proc, args = ('test', ))
    p.start()
    p.join()
    print('End')

输出结果如下:

Parent process 26524.
Run child process test (13336)...
End

如果要启动大量的子进程,可以用进程池的方式批量创建子进程

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

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

将在标准输出中打印

[1, 4, 9]

其中:

(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模块介绍)