在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. kafka生产消费原理笔记

    一.什么是kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性 ...

  2. Kafka分区数与消费者个数

    Kafka的分区数是不是越多越好? 分区多的优点 kafka使用分区将topic的消息打散到多个分区分布保存在不同的broker上,实现了producer和consumer消息处理的高吞吐量.Kafk ...

  3. CubieTruck入手第一天

    基本的參考资料整理例如以下: mod=viewthread&tid=160" id="thread_subject" style="word-wrap: ...

  4. jQuery源代码解析(3)—— ready载入、queue队列

    ready.queue放在一块写,没有特殊的意思,仅仅是相对来说它俩可能源代码是最简单的了.ready是在dom载入完毕后.以最高速度触发,非常实用. queue是队列.比方动画的顺序触发就是通过默认 ...

  5. LeetCode之Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  6. CNDS账号密码

    您购买的CSDN 100下载积分 发货如下:CSDN账号:masunwei0961CSDN密码:sangsang3邮箱:lao42981894zh@163.com邮箱密码:songsong3

  7. 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

    1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...

  8. 关于javascrpt if快速判断说明

    在js中有如下值能作为if的条件判断: 在js中有6种类型 undefined.null.string.number.boolean和object  object是对象类型 它们在逻辑运算符里有对应的 ...

  9. (笔记)Linux服务器中判断客户端socket断开连接的方法

    下面来罗列一下判断远端已经断开的方法:(转自http://blog.csdn.net/god2469/article/details/8801356) 法一: 当recv()返回值小于等于0时,soc ...

  10. 2013年第四届蓝桥杯C/C++B组省赛题目解析

    一. 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后 ...