首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python concurrent.futures

Python concurrent.futures
EN

Stack Overflow用户
提问于 2022-02-11 12:23:01
回答 1查看 63关注 0票数 0

我有一个多处理代码,每个进程都必须对相同的数据进行不同的分析。

我已执行:

代码语言:javascript
复制
with concurrent.futures.ProcessPoolExecutor() as executor:
   res = executor.map(goal_fcn, p, [global_DataFrame], [global_String])

for f in concurrent.futures.as_completed(res):
   fp = res

和职能:

代码语言:javascript
复制
def goal_fcn(x, DataFrame, String):
   return heavy_calculation(x, DataFrame, String)

问题是goal_fcn只被调用一次,而应该是多次调用。

在调试器中,我现在检查了变量p,它有多个列和多个行。在goal_fcn内部,变量x只有第一行--看起来不错。

但是这个函数只调用一次。没有错误,代码只执行接下来的步骤。

即使我修改了变量p = [1,3,4,5],当然还有代码。goal_fcn只执行一次

我必须使用map(),因为需要保持输入和输出之间的顺序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-11 13:24:09

map的工作方式类似于zip。它一次终止至少一个输入序列在它的末端。您的[global_DataFrame][global_String]列表每个都有一个元素,因此这是映射结束的地方。

有两种方法可以解决这个问题:

  1. 使用itertools.product。这相当于“所有数据帧、所有字符串、所有p”的运行。就像这样:

代码语言:javascript
复制
def goal_fcn(x_DataFrame_String):
    x, DataFrame, String = x_DataFrame_String
    ...

executor.map(goal_fcn, itertools.product(p, [global_DataFrame], [global_String]))

  1. 绑定固定参数而不是滥用序列参数.

代码语言:javascript
复制
def goal_fcn(x, DataFrame, String):
    pass

bound = functools.partial(goal_fcn, DataFrame=global_DataFrame, String=global_String)
executor.map(bound, p)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71080033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档