当函数是 lambda 或嵌套函数时,concurrent.futures.ProcessPoolExecutor 会挂起

2023-12-15

任何人都可以深入了解为什么使用 lambda 或嵌套函数(f) 将使concurrent.futures.ProcessPoolExecutor挂在下面的代码示例中吗?

import concurrent.futures
​
​
def f2(s):
    return len(s)
​
​
def main():
    def f(s):
        return len(s)
​
    data = ["a", "b", "c"]
​
    with concurrent.futures.ProcessPoolExecutor(max_workers=1) as pool:
        # results = pool.map(f, data) # hangs
        # results = pool.map(lambda d: len(d), data)  # hangs
        # results = pool.map(len, data)  # works
        results = pool.map(f2, data) # works
​
    print(list(results))
​
​
if __name__ == "__main__":
    main()

长话短说,Pool/ProcessPoolExecutor 都必须序列化所有内容,然后再将其发送给工作人员。序列化(有时也称为 pickling)实际上是保存函数名称的过程,只有在 Pool 想要访问它时才再次导入。为了使此过程正常工作,必须在顶层定义该函数,因为子函数无法导入嵌套函数 这就是出现以下错误的原因:

AttributeError: Can't pickle local object 'MyClass.mymethod.<locals>.mymethod'

为了避免这个问题,有一些我认为不可靠的解决方案。如果您可以灵活地使用其他软件包,pathos实际上是一个替代方案works。例如,以下内容不会挂起:

import pathos
import os

class SomeClass:

    def __init__(self):
         self.words = ["a", "b", "c"]

    def some_method(self):
    
        def run(s):
            return len(s)
    
        return list(pool.map(run, self.words))

pool = pathos.multiprocessing.Pool(os.cpu_count())
print(SomeClass().some_method())

它确实会打印

[1, 1, 1]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当函数是 lambda 或嵌套函数时,concurrent.futures.ProcessPoolExecutor 会挂起 的相关文章

  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐

  • 从 $lookup 以及整个文档中获取数组中过滤后的元素数量

    我在 MongoDB 中有这样的查询 db emailGroup aggregate lookup from link localField id foreignField emailGroupId as link unwind link
  • 无法访问远程git仓库

    我通过 github 网站的 新按钮 创建了一个 git 存储库 然后我使用 git bash 设置本地存储库并尝试拉取远程存储库 它有默认的自述文件 但收到 访问被拒绝错误 与此问题中看到的错误相同 无法推送到 git 存储库 权限被拒绝
  • 使用 Gson for Java 进行 JSON 解析

    我想解析 JSON 类型的数据String 我在用谷歌Gson I have jsonLine data translations translatedText Hello world 我的班级是 public class JsonPars
  • python 中的计算器

    我正在尝试制作可以使用基本 4 个运算符 例如 1 2 3 4 5 求解表达式的计算器 但是它不起作用 我不知道出了什么问题 请检查我的代码 当我运行它时 我在 8 行中收到无限数量的错误return ret parts 0 ret par
  • MySQL/InnoDB 和长时间运行的查询

    当使用 myisam 引擎运行查询时 因为它不是事务性的 所以长查询 据我所知 不会影响其他查询的数据 在 InnoDB 中 它警告的事情之一是避免长查询 InnoDB快照时 是不是把所有东西都快照了 我问这个问题的原因是 无论出于何种原因
  • 为什么我的批处理脚本以管理员身份运行时无法执行?

    我正在尝试创建一个 Windows 批处理脚本 该脚本将允许我部署 Windows 7 64 位的准备更新 但该脚本无法正常启动 我将所有文件放在同一个文件夹中 我尝试提取文件 然后通过 dism 安装它们 当我正常启动它时 文件提取 但
  • ThreeJS:将边缘几何应用于 ArrowHelper

    我正在尝试使用 ThreeJS 中的 ArrowHelper 创建箭头 let arrow new THREE ArrowHelper direction normalize new THREE Vector3 length color h
  • 如何远程访问自托管的 Nancy 服务?

    我正在创建一个简单的 Windows 服务 该服务托管 Nancy 实例以提供其内部数据的视图 在本地计算机上使用浏览器时 一切都按预期运行 我看到了它所提供的观点 但是 我找不到它无法从远程浏览器 在同一网络上 访问的任何原因 从远程浏览
  • 向量的下限

    我有这个简单的课程 class MyClass public int id string name 我想要一个带有指向此类对象的指针的向量 该向量按引用排序MyClass id 我以为使用lower bound很容易 我之前用对象向量 而不
  • minikube 和 ingress-nginx 没有打开端口 80

    我是 ingress nginx 的新手 我使用 minikube 启用了它minikube addons enable ingress 在寻找与 ingress nginx 相关的服务时 我跑了kubectl get services n
  • 如何在 WPF 中添加自定义路由命令?

    我有一个包含菜单和子菜单的应用程序 我已将应用程序命令附加到一些子菜单项 例如剪切 复制和粘贴 我还有一些其他没有应用程序命令的菜单项 如何将自定义命令绑定添加到这些子菜单项 我已经经历过this文章但无法将事件附加到我的子菜单项 我使用放
  • WebUSB - “无法声明接口”错误

    我尝试使用下面的代码通过 WebUSB API 使用 POS 打印机 但失败了 claimInterface 错误为DOMException Unable to claim interface 所有测试均在 Linux 上的 Chrome
  • 如何使用 Tesseract 提高图像质量以从图像中提取文本

    我试图在下面的代码中使用 Tesseract 来提取图像的两行 我尝试提高图像质量 但没有成功 谁能帮我 from PIL import Image ImageEnhance ImageFilter import pytesseract i
  • VB6 中的运行时错误堆栈跟踪或位置

    我维护一个用 VB6 编写的旧应用程序 在客户端环境中 它会引发运行时错误 我无法在调试器下重现该错误 有什么方法可以获取堆栈跟踪或错误位置吗 我的意思是 不要在代码中放置跟踪语句 例如here或添加错误处理程序以记录每个过程 例如here
  • 如何在 Mac 上将 adb 与 genymotion 结合使用?

    我正在 Mac OS X 10 9 4 上使用 cordova 构建 Android 应用程序 我正在使用 genymotion 创建虚拟设备 昨天 我能够获得 cordova run android 让我的应用程序在 genymotion
  • 反射不适用于 Android 发布的 apk。即使禁用了 proguard/minify

    目前我面临一个奇怪的问题 我的应用程序的发布 apk 抛出 NoSuchFieldExceptions 它在调试 apk 上运行良好 我试图获取的字段是 android widget 打包的 我还努力启用 proguard 并在 progu
  • 如何更改自定义子面板中的默认排序 - Sugarcrm?

    我想在自定义面板中按 创建日期 进行默认排序 您能指导我吗 如何将其设为 创建日期 作为默认排序 请帮我 In your layout defs改变sort by到所需的列 在此示例中 用于排序的默认列是date entered
  • jinja2 如何删除日期时间中的微秒

    在 Jinja2 模板中 我想显示最后一次登录 Last Login user last seen last seen应该是 sqlite 中的日期时间对象 它总是给我这样的东西 2014 07 27 23 09 36 467761 在模板
  • 卡桑德拉更新专栏

    我如何更新 cassandra 数据库中的列 columnfam username name edds surname surname email email protected 例如我需要更新姓氏 我使用 PHP 客户端 PHPCASSA
  • 当函数是 lambda 或嵌套函数时,concurrent.futures.ProcessPoolExecutor 会挂起

    任何人都可以深入了解为什么使用 lambda 或嵌套函数 f 将使concurrent futures ProcessPoolExecutor挂在下面的代码示例中吗 import concurrent futures def f2 s re