在python中经常会到用多线程处理某个函数来缩短运行时间。

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的计算结果。

但是这个函数仅允许函数的输入变量为1,如果函数需要多个参数输入,那个就无法用上面的程序。比如:

def work(x, y):
return x + y

遇到这种情况我们有一下几种处理方法:

1). 用partial函数提取主要的一个参数固定其他参数

比如,我们想用x去加一个固定值,那么我们就认为x是主要参数,固定y:

from functools import partial

partial_work = partial(work, y=1) # 提取x作为partial函数的输入变量
results = pool.map(partial_work, x)

2). 将多个输入变量打包到一个参数

x = [1,2,3,4,5,6]
y = [1,1,1,1,1,1]
x_y = zip(x, y)
results = pool.map(work, x_y)

3). 使用pathos包下的multiprocessing

这个包是使用dill的multiprocessing的一个fork,允许多参数输入:

from pathos.multiprocessing import ProcessingPoll as Pool

pool = Pool(4)
results = pool.map(work, x, y)

总结:

当函数的参数在不同时候的输入均不同,那么前一种就不太合适。而在后面两种中,用pathos会更简单些,不太容易报pickling error。

参考:

https://github.com/uqfoundation/pathos

http://stackoverflow.com/questions/8804830/python-multiprocessing-pickling-error

http://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments

Python多线程运行带多个参数的函数的更多相关文章

  1. c++ 切勿重新定义继承来的带缺省参数的函数

    切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...

  2. python 装饰器 (多个参数的函数,带参数的装饰器)

    最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...

  3. Python基础之定义有默认参数的函数

    1. 构建有默认参数的函数 当我们在构建一个函数或者方法时,如果想使函数中的一个或者多个参数使可选的,并且有一个默认值,那么可以在函数定义中给参数指定一个默认值,并且放到参数列表的最后就行了.比如: ...

  4. [转载]c# 多线程一个带多个参数的方法

    比如我要线程一个private void subPing(int pre,int end) 我在Thread t=之后应该如何写 用匿名委托吧!那么简单为什么要这样写!t = new Thread(d ...

  5. Python基础之只接收关键字参数的函数

    当我们希望函数的某些参数强制使用关键字参数时,可以将强制关键字参数放到某个*后面就能得到这种效果.比如: def recv(maxsize, *, block): """ ...

  6. 嵌入Python | 调用Python模块中有参数的函数

    开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...

  7. 如何编写一个带命令行参数的Python文件

    看到别人执行一个带命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持带命 ...

  8. Python 强制停止多线程运行

    强制停止多线程运行 by:授客 QQ:1033553122 #!/usr/bin/env python # -*- coding:utf-8 -*-     __author__ = 'shouke' ...

  9. Qt配置cmake;运行带参数的程序

    配置cmake编译器,步骤如下: 步骤1:  Qt下新建一个project. 步骤2:  在该project目录下创建一个CMakeLists.txt文件,并按规范编写该文件. Tip: projec ...

随机推荐

  1. (转载)WPF中的动画——(一)基本概念

    http://www.cnblogs.com/TianFang/p/4050845.html WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面.首先,我们来复习一下动画的基本概念.计 ...

  2. keras系列︱Application中五款已训练模型、VGG16框架(Sequential式、Model式)解读(二)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72859145 中文文档:http://keras-cn.readthedocs.io/ ...

  3. JProfiler 9版本注册码(亲测可用!!!)

    JProfiler 9版本注册码(亲测可用!!!) 按默认选择“Single or evaluation license” ,Name 和 Company 随意填!!! JProfiler 9.2  ...

  4. Java内存模型和JVM内存管理

    Java内存模型和JVM内存管理   一.Java内存模型: 1.主内存和工作内存(即是本地内存): Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取 ...

  5. 【转】android学习日记01--综述

    转自:http://www.cnblogs.com/aiguozhe/p/3541941.html 一.总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组 ...

  6. docker-compose搭建wordpress

    1.安装docker-compose apt-get install docker-compose 发现下载的是旧版本,不支持2.0的配置文件 还是下载新版本吧,去github查看最新版本https: ...

  7. 《FPGA全程进阶---实战演练》第一章之FPGA介绍

    1 什么是FPGA FPGA也即是Field Programmable Gate Array的缩写,翻译成中文就是现场可编程门阵列.FPGA是在PAL.GAL.CPLD等可编程器件的基础上发展起来的新 ...

  8. pandas Series KeyError: -1

    前几天写分析方法,遇到的一个错误: 具体我已经在stackoverflow 里面得到了详细的解答,下面我把问题和解决办法总结一下,方便日后的回顾 问题: sql = "select {}, ...

  9. c 变量的存储类型auto等(基础知识)和c函数变量

    总结 1).在c语言中每一个变量和函数有两个属性:数据类型和数据的存储类别. 2). 对数据型(如整型.字符型等).存储类别指的是数据在内存中存储的方式. 存储方式分为两大类: 静态存储类和动态存储类 ...

  10. tpshop模板

    TPshop模板在根目录 的 Template 下面 要修改某个模块下面的模板路径 修改 对应模块下面的Conf/html.php 文件的 <?php return array( 'HTML_C ...