python多进程multiprocessing Pool相关问题

python多进程想必大部分人都用到过,可以充分利用多核CPU让代码效率更高效。

我们看看multiprocessing.pool.Pool.map的官方用法

map(func, iterable[, chunksize])
A parallel equivalent of the map() built-in function (it supports only one iterable argument though). It blocks until the result is ready.

This method chops the iterable into a number of chunks which it submits to the process pool as separate tasks. The (approximate) size of these chunks can be specified by setting chunksize to a positive integer.

一、多参数传入如何变成一个参数

map的用法,函数func只允许一个可迭代的参数传递进去。

如果我们需要传递多个参数时怎么办呢,

一种方法是把多个参数放入到一个list或者元祖里当做一个参数传入func中

还有一种是使用偏函数,偏函数(Partial function)是通过将一个函数的部分参数预先绑定为某些值,从而得到一个新的具有较少可变参数的函数。在Python中,可以通过functools中的partial高阶函数来实现偏函数功能。偏函数partial的源码如下:

def partial(func, *args, **keywords):
    """New function with partial application of the given arguments
    and keywords.
    """
    if hasattr(func, ‘func‘):
        args = func.args + args
        tmpkw = func.keywords.copy()
        tmpkw.update(keywords)
        keywords = tmpkw
        del tmpkw
        func = func.func

    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

使用方法也很简单,比如我们有一个func函数,里面要传入texts,lock, data三个参数,但是我们想要用多进程把data分别传入进去计算,那么我们就可以先用partial函数,将texts和lock先固定到函数里组成一个新的函数,然后新函数传入data一个参数就可以了

from functools import partial
def func(texts, lock, data):
    ......

pt = partial(func, tests, lock)  

# 新函数pt只需要传入一个参数data

这我们就可以对pt函数套用pool.map函数并且只传入一个参数data里。

二、多进程间通讯

还有一种情况是,多进程间要相互之间通讯,比如我每一个进程的结果都要存入到texts这个list里。当然要把这个texts当做参数传入到函数里面,但是一般的list并不能共享给所有的进程,我们需要用multiprocessing.Manager().list()建立的list才可以用于进程间通讯,防止冲突,还要对texts加上锁,防止操作冲突。注意multiprocessing.Lock() 创建的锁不能传递,需要使用multiprocessing.Manager().Lock()来创建。multiprocessing.Manager()可创建字典,也可创建list,lock,它创建的变量可用于多进程间传递才不会出错。比如以下代码:

texts = multiprocessing.Manager().list()
lock = multiprocessing.Manager().Lock()
pool = multiprocessing.Pool(processes=4)
data = list(range(20))
pt = partial(func, texts, lock)
pool.map(pt, data)
pool.close()
pool.join()

原文地址:https://www.cnblogs.com/zongfa/p/11332556.html

时间: 2024-10-11 13:58:57

python多进程multiprocessing Pool相关问题的相关文章

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

python多进程-----multiprocessing包

multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多线程并不能做到真正的并行处理,只能完成相对的并发处理,那么我们需要的就是python的多进程来完成并行处理,把所有的cpu资源都利用起来.multiprocessing的很大一部分与threading使用同一套API,只不过换到了多进程的环境.这里面要注意,对于多进程来说,win32平台和unix平

python ---多进程 Multiprocessing

和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 Python 还要出一个 multiprocessing 呢? 原因很简单, 就是用来弥补 threading 的一些劣势, 比如在 threading 教程中提到的GIL. 创建多进程 import multiprocessing as mp import threading as td def

Python多进程multiprocessing使用示例

mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multiprocessing def worker(num): """thread worker function""" print 'Worker:', num return if __name__ == '__main__': jobs = [] for i

Python中multiprocessing.Pool运行带多个参数的函数

在python中经常会到用多线程处理某个函数来缩短运行时间,但通常multiprocessing.Pool的map函数只接受一个可迭代参数. from multiprocessing import Pool def work(x): return x+1 pool = Pool(processes=4) # 4个线程 x = [1,2,3,4,5,6] results = pool.map(work, x) print results 运行上面的程序就会多线程处理并打印出输入x的计算结果. 但是

Python多进程multiprocessing

import multiprocessing import time # 具体的处理函数,负责处理单个任务 def func(msg): # for i in range(3): print (msg) time.sleep(1) return "done " + msg if __name__ == "__main__": # 进程池,创建多个进程,并行执行 pool = multiprocessing.Pool(processes=4) # 把运行的结果添加到一

python多进程multiprocessing模块中Queue的妙用

最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process.Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度.之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条.但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小

python 多进程multiprocessing 模块

multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 multiprocessing.active_children() preces() 创建一个进程对象 multiprocessing.Preces(target=function_name, args=()) target: 函数名 args: 函数需要的参数,以tuple形式传入,一个参数时需(1,)

python多进程(multiprocessing调用类函数)

#coding=utf-8 import os import multiprocessing from time import ctime, sleep from selenium import webdriver class testClass(object): def worker(self, interval, browser="Chrome", url="http://loginurl"): driver = eval("webdriver.%s(