[python]multiprocessing模块多进程

514 阅读2分钟

1/前言

multiprocessing模块可以实现多进程。因为multiprocessing模块中有Process()类和Pool()类。
这2个类都可以实例化成一个进程对象。
模块中的Pool()类可以实例化一个进程池,pool = multiprocessing.Pool(6)
其中的参数6是设置的最大同时执行的进程的个数,该参数的值,一般是<=服务器的核心的数量。
可以用在for循环的场景下.
apply_async(),类的函数,异步调用,非堵塞,需要使用.join()函数堵塞主进程。
 # 源码
 def apply_async(self, func, args=(), kwds={}, callback=None,
            error_callback=None):
        '''
        Asynchronous version of `apply()` method.
        '''
        if self._state != RUN:
            raise ValueError("Pool not running")
        result = ApplyResult(self._cache, callback, error_callback)
        self._taskqueue.put(([(result._job, 0, func, args, kwds)], None))
        return result

#参数解释下:
  #func: 是调用的函数,也就是`中间函数`
  #args: 是`中间函数`的入参,以元组的方式传递,如果只有一个入参,则需要在参数后面加逗号
  #kwargs: 传递字典类型参数
  #callback: 回调函数,该函数只能接受单个参数的可调用对象,当结果完成时就找对象的callback回调函数
  #error_callback:只能接受单个参数的可调用对象。如果目标函数失败,则以该异常实例调用error_callback。

# 这里注意下:
apply_async()是异步非堵塞的,也就是子进程不能堵塞主进程,需要使用join()函数才行。

2/demo

import multiprocessing

# 定义回调函数
def func_callback(x):
    with open('result.txt', 'a+') as f:
        line = str(x) + "\n"
        f.write(line)

def func_middle(num):
    return num*(num+1)

if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    for i in range(1000):
        pool.apply_async(func=func_middle, args=(i,), callback=func_callback)
        
    pool.close()  # 关闭进程池,close()函数必须在join()函数之前。
    pool.join()   # 堵塞主进程,及让进程池中的所有任务执行完之后,在执行下面的任务。


# func_middle()是中间函数,中间函数的返回结果,传入func_callback()回调函数(回头再调用的函数,及等中间函数出来了结果再调用的函数)