本问题已经有最佳答案,请猛点这里访问。

我需要一些方法来使用pool.map()中接受多个参数的函数。根据我的理解,pool.map()的目标函数只能有一个iterable作为参数,但是有没有其他参数也可以传入的方法?在这种情况下,我需要传递一些配置变量,比如锁(),并将信息记录到目标函数中。

我试过做一些研究,我认为我可以使用部分函数使它工作?但是我不完全理解这些是如何工作的。任何帮助都将不胜感激!下面是一个简单的例子,说明我想做什么:

def target(items, lock):

for item in items:

# Do cool stuff

if (... some condition here ...):

lock.acquire()

# Write to stdout or logfile, etc.

lock.release()

def main():

iterable = [1, 2, 3, 4, 5]

pool = multiprocessing.Pool()

pool.map(target(PASS PARAMS HERE), iterable)

pool.close()

pool.join()

这里讨论:stackoverflow.com/questions/5442910/…(我成功地使用了J.F.Sebastien的"star"方法)

请在使用多进程时使用try/finally子句,finally中包含close()和join(),以确保在发生错误时关闭进程。stackoverflow.com/questions/30506489/…

您可以使用EDOCX1[0]进行此操作(如您怀疑的那样):

from functools import partial

def target(lock, iterable_item):

for item in iterable_item:

# Do cool stuff

if (... some condition here ...):

lock.acquire()

# Write to stdout or logfile, etc.

lock.release()

def main():

iterable = [1, 2, 3, 4, 5]

pool = multiprocessing.Pool()

l = multiprocessing.Lock()

func = partial(target, l)

pool.map(func, iterable)

pool.close()

pool.join()

例子:

def f(a, b, c):

print("{} {} {}".format(a, b, c))

def main():

iterable = [1, 2, 3, 4, 5]

pool = multiprocessing.Pool()

a ="hi"

b ="there"

func = partial(f, a, b)

pool.map(func, iterable)

pool.close()

pool.join()

if __name__ =="__main__":

main()

输出:

hi there 1

hi there 2

hi there 3

hi there 4

hi there 5

太棒了,我想我所需要的就是一个这样清晰的例子。非常感谢!

很好的例子。但有一个问题:为什么在target的定义中有for item in items:?

@让·弗朗索瓦。复制/粘贴错误!谢谢你指出。

那些对锁有问题的人,请查看stackoverflow.com/questions/25557686/…

如果变量在第一个位置呢?如test(input, p1, p2, p3=None),我有p1, p2, p3固定,input变化?

@Mithril写了一个这样的顶级函数:def mytest(p1, p2, input, p3=None): test(input, p1, p2, p3=None),然后做func = partial(mytest, some_p1, some_p2, p3=some_p3),把func传递给pool.map。

您可以使用允许多个参数的map函数,就像在pathos中找到的multiprocessing的分叉一样。

>>> from pathos.multiprocessing import ProcessingPool as Pool

>>>

>>> def add_and_subtract(x,y):

...   return x+y, x-y

...

>>> res = Pool().map(add_and_subtract, range(0,20,2), range(-5,5,1))

>>> res

[(-5, 5), (-2, 6), (1, 7), (4, 8), (7, 9), (10, 10), (13, 11), (16, 12), (19, 13), (22, 14)]

>>> Pool().map(add_and_subtract, *zip(*res))

[(0, -10), (4, -8), (8, -6), (12, -4), (16, -2), (20, 0), (24, 2), (28, 4), (32, 6), (36, 8)]

pathos使您能够轻松地用多个输入嵌套分层并行映射,因此我们可以扩展我们的示例来证明这一点。

>>> from pathos.multiprocessing import ThreadingPool as TPool

>>>

>>> res = TPool().amap(add_and_subtract, *zip(*Pool().map(add_and_subtract, range(0,20,2), range(-5,5,1))))

>>> res.get()

[(0, -10), (4, -8), (8, -6), (12, -4), (16, -2), (20, 0), (24, 2), (28, 4), (32, 6), (36, 8)]

更有趣的是,构建一个可以传递到池中的嵌套函数。这是可能的,因为pathos使用dill,它可以序列化Python中的几乎所有内容。

>>> def build_fun_things(f, g):

...   def do_fun_things(x, y):

...     return f(x,y), g(x,y)

...   return do_fun_things

...

>>> def add(x,y):

...   return x+y

...

>>> def sub(x,y):

...   return x-y

...

>>> neato = build_fun_things(add, sub)

>>>

>>> res = TPool().imap(neato, *zip(*Pool().map(neato, range(0,20,2), range(-5,5,1))))

>>> list(res)

[(0, -10), (4, -8), (8, -6), (12, -4), (16, -2), (20, 0), (24, 2), (28, 4), (32, 6), (36, 8)]

但是,如果您不能走出标准库,您将不得不以另一种方式进行。在这种情况下,最好的选择是使用multiprocessing.starmap,如这里所示:python multiprocessing pool.map用于多个参数(由@roberto在OP文章的注释中指出)

获取pathos:https://github.com/uqfoundation

如果您没有访问functools.partial的权限,也可以为此使用包装函数。

def target(lock):

def wrapped_func(items):

for item in items:

# Do cool stuff

if (... some condition here ...):

lock.acquire()

# Write to stdout or logfile, etc.

lock.release()

return wrapped_func

def main():

iterable = [1, 2, 3, 4, 5]

pool = multiprocessing.Pool()

lck = multiprocessing.Lock()

pool.map(target(lck), iterable)

pool.close()

pool.join()

这使得target()成为一个接受锁的函数(或任何你想给出的参数),它将返回一个只接受一个iterable作为输入的函数,但仍然可以使用你的所有其他参数。这就是最终传递给pool.map()的内容,然后应该毫无问题地执行。

我已经非常晚了,但这段代码不起作用,因为嵌套函数不能被pickle。调用target(lck)将返回嵌套的wrapped_func函数,该函数需要经过处理才能传递给工作进程,并且总是失败。

python中multiple函数_关于多处理:在Python中将多个参数传递给pool.map()函数相关推荐

  1. python中datetime库_一天掌握一个Python库--datetime库

    #一天掌握一个Python库--datetime库 **datatime** 模块题共用一些处理日期,时间和时间间隔的函数.这个模块使用面向对象的交互取代了**time**模块中整形/元组类型的时间函 ...

  2. python中的映射_一文读懂Python中的映射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  3. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例

    前言: 今天为大家带来的内容是零基础入门:python中子类继承父类的__init__方法实例!具有不错的参考意义,希望在此能够帮助到各位!(喜欢的话记得点赞转发关注不迷路哦) 使用Python写过面 ...

  4. 怎么在python中输入矩阵_如何使用NumPy在Python中实现矩阵?

    矩阵被用作数学工具,在现实世界中有多种用途.在本文中,我们将按照以下顺序讨论Python中关于使用著名的NumPy库的矩阵的所有内容:什么是NumPy以及何时使用它?在NumPy 矩阵被用作数学工具, ...

  5. python中常用模块_工作中用过的Python常用模块:(基于3.x)

    内置模块: sys 用于提供对解释器相关的访问及维护.例如:sys.argv --传参 sys.platform --返回系统平台名称 sys.version --查看python版本 os 用于提供 ...

  6. python中import星_【已解决】Python中递归import导入:ImportError: cannot import name

    折腾: 期间,从错误信息中可以看到:Traceback (most recent call last): File "/usr/lib64/python3.4/runpy.py", ...

  7. 感知器及其在python中的实现_感知器及其在Python中的实现

    什么是感知器? 生物神经元示意图 感知器的概念类似于大脑基本处理单元神经元的工作原理.神经元由许多由树突携带的输入信号.胞体和轴突携带的一个输出信号组成.当细胞达到特定阈值时,神经元会发出一个动作信号 ...

  8. python中惩罚的代码_如何只为在python中使用的实现支付依赖惩罚?

    我有一组相当简单的功能,我有多个实现,例如,一个可以由redis.mongodb或postgresql支持的数据存储.我应该如何构造/编写代码,以便希望使用这些实现之一的代码只需要该实现的依赖项,例如 ...

  9. python中rgb颜色_自定义RGB颜色与Python诅咒

    我正在用Python编写一个程序,使用标准库中的curses模块.在 我希望我的程序只是退出,如果它不能使用自定义颜色我指定的RGB三元组.在 我有一些入门代码,看起来像:import curses ...

最新文章

  1. 二分查找算法的两种实现方式:非递归实现和递归实现
  2. “我太喜欢你了”——友情的表达方式?
  3. Android 快速开发框架Afinal
  4. 各个版本spring的jar包以及源码下载地址
  5. eai app_EAI的Spring集成教程
  6. git clone github源码 下载速度很慢的解决方法
  7. 从C到JAVA,从面向过程到面向对象
  8. 如何实现ArcSDE的集群功能
  9. ASP.NET Web API 2基于令牌的身份验证
  10. Windows 10搜集的用户隐私数据全部在此
  11. protel99se的封装库
  12. 河南省周口市安吉软件测试培训中心第一次软件测试课程-计算机基础理论论篇
  13. Kali安装beef-xss
  14. 灵巧好用的手机便签软件
  15. windows输入英文-搜狗输入法不提示很恼火怎么办
  16. Quantopian 做空恐慌指数回测
  17. L1正则化进行特征选择
  18. 架构设计---技术栈01
  19. 获取视频网站上视频的缩略图以及其他信息
  20. 关于用户 'SA' 登录失败

热门文章

  1. CSS3的弹性盒子flex详解(2)
  2. jQuery的事件1——on,one
  3. 18行代码AC-Leecode 299. 猜数字游戏——Leecode每日一题系列
  4. 测试点3错的来:1028 人口普查 (20分)(解题报告)
  5. 怎么在linux下用mysql建库_在MySQL/MariaDB中创建数据库、数据库用户和授予特权(针对Linux平台)...
  6. 传统公司部署OpenStack(t版)简易介绍(七)——cinder模块部署
  7. 国内网站安全测试6大步骤
  8. python笔记之if练习
  9. TOMCAT部署项目的方式
  10. java用循环给map里面存值_Java中如何遍历Map对象的4种方法