Python多线程运行带多个参数的函数
在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多线程运行带多个参数的函数的更多相关文章
- c++ 切勿重新定义继承来的带缺省参数的函数
切勿重新定义继承来的带缺省参数的函数.我们知道,继承来的函数是virtual 的,至于原因在上一节中已经说明了,即“切勿重新定义父类non-virtual函数”.所以确切的描述应该是“切勿重新定义继承 ...
- python 装饰器 (多个参数的函数,带参数的装饰器)
最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...
- Python基础之定义有默认参数的函数
1. 构建有默认参数的函数 当我们在构建一个函数或者方法时,如果想使函数中的一个或者多个参数使可选的,并且有一个默认值,那么可以在函数定义中给参数指定一个默认值,并且放到参数列表的最后就行了.比如: ...
- [转载]c# 多线程一个带多个参数的方法
比如我要线程一个private void subPing(int pre,int end) 我在Thread t=之后应该如何写 用匿名委托吧!那么简单为什么要这样写!t = new Thread(d ...
- Python基础之只接收关键字参数的函数
当我们希望函数的某些参数强制使用关键字参数时,可以将强制关键字参数放到某个*后面就能得到这种效果.比如: def recv(maxsize, *, block): """ ...
- 嵌入Python | 调用Python模块中有参数的函数
开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...
- 如何编写一个带命令行参数的Python文件
看到别人执行一个带命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持带命 ...
- Python 强制停止多线程运行
强制停止多线程运行 by:授客 QQ:1033553122 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' ...
- Qt配置cmake;运行带参数的程序
配置cmake编译器,步骤如下: 步骤1: Qt下新建一个project. 步骤2: 在该project目录下创建一个CMakeLists.txt文件,并按规范编写该文件. Tip: projec ...
随机推荐
- 【微信小程序】下拉刷新真机测试无效
根据文档的描述,做上拉加载时直接实现页面的onReachBottom()函数即可.但是要做下拉刷新时,除了实现onPullDownRefresh()函数外,还必须要在app.json中配置开启enab ...
- 微信小程序学习资料
官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev/ W3CSchool的教程 https://www.w3cschool.cn/weixinapp/ 更多参 ...
- WPF DataTomplate中Command无效
问题:在DataTomplate中添加一个Button,Button添加Command,但是Command生效. 原因:ItemTemplate的DataContext指代不明,需要改为父类的Data ...
- [转载]WPF控件拖动
这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...
- SHT30 Linux标准 i2c-dev 读取程序
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- linq操作符:连接操作符
linq中的连接操作符主要包括Join()和GroupJoin()两个. 一.Join()操作符 Join()操作符非常类似于T-SQL中的inner join,它将两个数据源进行连接,根据两个数据源 ...
- Entity Framework应用:导航属性
一.主键和外键 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组是能唯一标识一条记录,该属性组就可以称为主键.例如: 学生版(学号.姓名.性别.班级) 其中每个学生的学号是唯一的,学号就是一 ...
- 跨域通信--Window.postMessage()
一.跨源通信概述 源:协议.端口号(https默认值433).主机域名(document.domain) 作用:向目标窗口派发MessageEvent消息(四个属性) 兼容参考 MessageEven ...
- netable 禁用拖动
nestable在点击的时候,有一个拖动的状态被触发,会导致你给nestable上加的链接都会无效. 只要在最外层的li里加入一个class为:dd-nodrag,就不会被触发了.然后你在子菜单中就可 ...
- 【转】JMeter完成一个java请求的压测
JMeter完成java请求的压力测试详解以及问题总结 原文地址:http://www.cnblogs.com/zhaoxd07/p/4895224.html 作者:KK_Yolanda 这篇文 ...