【Python】多进程 AttributeError: Can’t pickle local object

最近写了一个在电脑磁盘搜索全部文件的的一个小程序,效果达到了,但是效率5~6分钟,效率是十分的不理想。故而直接想到提升效率的多线程或者多进程,然后发现的一个诡异的事情,我使用的是官方的Cpython 版本的python 。发现,在Cpython 里面,多进程要比多线程快多了,甚至超一倍。后来了解到在多线程里面,受到GIL全称global interpreter lock,全局解释器锁的影响,多线程是共用一个GIL,
多进程用的每一个进程一个CIL,所以效率更甚。

然而,问题出现了,python 多进程 AttributeError: Can't pickle local object

示例代码(测试用):

from threading import Thread
from multiprocessing import Process, Queue as mQueue
from queue import Queue
import timedef single_test():my_sum = 0for i in range(1, 10000000):my_sum += iprint("单线程结果:", my_sum)def thread_test():def sum_func(q, start, end):my_sum = 0for i in range(start, end):my_sum += iq.put(my_sum)def run_thread():q = Queue()t1 = Thread(target=sum_func, args=(q, 1, 5000000))t2 = Thread(target=sum_func, args=(q, 5000000, 10000000))t1.start()t2.start()t1.join()t2.join()my_sum = 0while not q.empty():my_sum += q.get()print("多线程结果:", my_sum)run_thread()def process_test():def sum_process_func(q, start, end):my_sum = 0for i in range(start, end):my_sum += iq.put(my_sum)def run_process():q = mQueue()p1 = Process(target=sum_process_func, args=(q, 1, 5000000))p2 = Process(target=sum_process_func, args=(q, 5000000, 10000000))p1.start()p2.start()p1.join()p2.join()my_sum = 0while not q.empty():my_sum += q.get()print("多进程结果:", my_sum)run_process()if __name__ == "__main__":t0 = time.time()single_test()t1 = time.time()thread_test()t2 = time.time()process_test()t3 = time.time()print(f"单线程耗时:{t1-t0}s")print(f"多线程耗时:{t2-t1}s")print(f"多进程耗时:{t3-t2}s")

解决方法一(避免是使用闭包:)

from threading import Thread
from multiprocessing import Process, Queue as mQueue
from queue import Queue
import timedef single_test():my_sum = 0for i in range(1, 10000000):my_sum += iprint("单线程结果:", my_sum)def thread_test():def sum_func(q, start, end):my_sum = 0for i in range(start, end):my_sum += iq.put(my_sum)def run_thread():q = Queue()t1 = Thread(target=sum_func, args=(q, 1, 5000000))t2 = Thread(target=sum_func, args=(q, 5000000, 10000000))t1.start()t2.start()t1.join()t2.join()my_sum = 0while not q.empty():my_sum += q.get()print("多线程结果:", my_sum)run_thread()def sum_process_func(q, start, end):my_sum = 0for i in range(start, end):my_sum += iq.put(my_sum)def process_test():def run_process():q = mQueue()p1 = Process(target=sum_process_func, args=(q, 1, 5000000))p2 = Process(target=sum_process_func, args=(q, 5000000, 10000000))p1.start()p2.start()p1.join()p2.join()my_sum = 0while not q.empty():my_sum += q.get()print("多进程结果:", my_sum)run_process()if __name__ == "__main__":t0 = time.time()single_test()t1 = time.time()thread_test()t2 = time.time()process_test()t3 = time.time()print(f"单线程耗时:{t1-t0}s")print(f"多线程耗时:{t2-t1}s")print(f"多进程耗时:{t3-t2}s")

解决方法二(pathos模块)

python闭包不支持pickle(序列化)。多进程需要函数能pickle。

1.更换pickle,考虑以下代码:

 from pathos.multiprocessing import ProcessingPool as Pool

网址
https://github.com/uqfoundation/pathos

【Python】多进程 AttributeError: Can‘t pickle local object相关推荐

  1. dill:解决python的“AttributeError: Can‘t pickle local object”及无法pickle lambda函数的问题

    dill:解决python的"AttributeError: Can't pickle local object"及无法pickle lambda函数的问题 参考文章: (1)di ...

  2. 【Python】dill:解决python的“AttributeError: Can‘t pickle local object”及无法pickle lambda函数的问题

    [Python]dill:解决python的"AttributeError: Can't pickle local object"及无法pickle lambda函数的问题 pyt ...

  3. python 多进程multiprocessing 队列queue报错:AttributeError: Can't pickle local object

    今天,test-191204-单个摄像头调用multiprocessing线程队列queue识别时,报错: D:\20191031_tensorflow_yolov3\python\python.ex ...

  4. PYTORCH保存模型时报错AttributeError: Can‘t pickle local object ‘Stage.__init__.<locals>.<lambda>‘

    解决方法: 点开报错的代码位置,将代码里面的import pickle改成import dill as pickle

  5. AttributeError: Can‘t pickle local object ‘GeneratorEnqueuer.start.<locals>.data_generator_task‘

     在win10上运行代码出现标题所示情况,最终通过修改两个地方内容完成代码的运行 1.将use_multiprocessing=True修改为use_multiprocessing=False 2.将 ...

  6. Can‘t pickle local object ‘get_transforms.<locals>.process‘

    Can't pickle local object 'get_transforms.<locals>.process' 网上的答案: AttributeError: Can't pickl ...

  7. Can't pickle local object 'CDLL.__init__.locals._FuncPtr'

    Can't pickle local object 'CDLL.__init__.<locals>._FuncPtr' 动态库代码: cv_dll=CDLL("E:\git_pr ...

  8. 使用pytorch时,遇到Can‘t pickle local object ‘xxx.<locals>.<lamba>‘的问题,注释有关部分有EOFError: Ran out of input问题

    如图,出现报错Can't pickle local object 'xxx..' 直接按照报错信息查网上,有许多可能的解答,有 pickle有限制,无法解析我模型文件中的lambda表达式 pickl ...

  9. Python多进程 AttributeError: Can't get attribute 'worker' on module '__main__' from

    被调用函数要放到 if main 的外面 虽说 if main 是从入口开始运行 实际情况应该是 外面的部分 先编译?

  10. TensorRT python多进程推理踩坑

    1.TensorRT多线程推理 此时需要在每个线程内创建上下文,且在初始化ctx之后进行ctx.pop(),推理操作前,ctx.push(),运行结束前运行ctx.pop() class detect ...

最新文章

  1. yolov5 mobile 剪枝
  2. C语言获取链表的中间值Middle of the Linked List(附完整源码)
  3. The Zen of Python, by Tim Peters
  4. SQL调优:带函数的谓词导致CBO Cardinality计算误差
  5. debian dhcp服务启动不了_DHCP服务器配置
  6. 我最近在学微信小程序开发,一起吗?
  7. 一个 TypeScript keyof 泛型用法
  8. SQL Server中数据库文件的存放方式,文件和文件组
  9. oracle判断一个值不在记录中,Oracle: DELETE前不需SELECT判断记录是否存在,INSERT前不需SELECT判断是否有若干字段值重复的记录。...
  10. linux由哪些部分组成,linux内核处于什么位置?,Linux由几部分组成?Linux系统结构介绍!...
  11. 项目整体流程及项目经理工作职责
  12. Introduction to BouncyCastle with Java
  13. 世界杯数据清单:真球迷看球必备,伪球迷速成指南(附数据amp;论文)
  14. 微信小程序开发使用onreachBottom实现页面触底加载及分页
  15. python中int() 按照“四舍五入”的方式取整
  16. Eclipse SVN文件对比详解
  17. Vulnhub 靶机测试NO.30 hacksudo FOG
  18. 嵌入式系统概述1-嵌入式系统定义、特点和发展历程
  19. 关于小程序开发的一些资源
  20. OSPF建立邻居、邻接关系

热门文章

  1. Vue 中获取 package.json 信息
  2. 我的世界服务器怎么制作头颅,我的世界怎么刷生物头颅 我的世界生物头颅制作方法-游侠网...
  3. removeClass删除类名称
  4. 阿里云CTO章文嵩:阿里云强大的数据和计算能力助力企业实现“弯道超车”
  5. 解决V-Rep接近传感器(距离传感器、超声波传感器、红外传感器)不能正常识别问题
  6. CSS3:3D环绕实现
  7. ubuntu20.04安装并运行ORB_SLAM3(一路顺风版)
  8. pandas绘图plot函数
  9. vs助手使用期过 编译CEGUI的问题:error C2061: 语法错误: 标识符“__RPC__out_xcount_part” VS2010...
  10. 综述:环境中的噬菌体宿主互作