【Python】多进程 AttributeError: Can‘t pickle local object
【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相关推荐
- dill:解决python的“AttributeError: Can‘t pickle local object”及无法pickle lambda函数的问题
dill:解决python的"AttributeError: Can't pickle local object"及无法pickle lambda函数的问题 参考文章: (1)di ...
- 【Python】dill:解决python的“AttributeError: Can‘t pickle local object”及无法pickle lambda函数的问题
[Python]dill:解决python的"AttributeError: Can't pickle local object"及无法pickle lambda函数的问题 pyt ...
- python 多进程multiprocessing 队列queue报错:AttributeError: Can't pickle local object
今天,test-191204-单个摄像头调用multiprocessing线程队列queue识别时,报错: D:\20191031_tensorflow_yolov3\python\python.ex ...
- PYTORCH保存模型时报错AttributeError: Can‘t pickle local object ‘Stage.__init__.<locals>.<lambda>‘
解决方法: 点开报错的代码位置,将代码里面的import pickle改成import dill as pickle
- AttributeError: Can‘t pickle local object ‘GeneratorEnqueuer.start.<locals>.data_generator_task‘
在win10上运行代码出现标题所示情况,最终通过修改两个地方内容完成代码的运行 1.将use_multiprocessing=True修改为use_multiprocessing=False 2.将 ...
- Can‘t pickle local object ‘get_transforms.<locals>.process‘
Can't pickle local object 'get_transforms.<locals>.process' 网上的答案: AttributeError: Can't pickl ...
- Can't pickle local object 'CDLL.__init__.locals._FuncPtr'
Can't pickle local object 'CDLL.__init__.<locals>._FuncPtr' 动态库代码: cv_dll=CDLL("E:\git_pr ...
- 使用pytorch时,遇到Can‘t pickle local object ‘xxx.<locals>.<lamba>‘的问题,注释有关部分有EOFError: Ran out of input问题
如图,出现报错Can't pickle local object 'xxx..' 直接按照报错信息查网上,有许多可能的解答,有 pickle有限制,无法解析我模型文件中的lambda表达式 pickl ...
- Python多进程 AttributeError: Can't get attribute 'worker' on module '__main__' from
被调用函数要放到 if main 的外面 虽说 if main 是从入口开始运行 实际情况应该是 外面的部分 先编译?
- TensorRT python多进程推理踩坑
1.TensorRT多线程推理 此时需要在每个线程内创建上下文,且在初始化ctx之后进行ctx.pop(),推理操作前,ctx.push(),运行结束前运行ctx.pop() class detect ...
最新文章
- yolov5 mobile 剪枝
- C语言获取链表的中间值Middle of the Linked List(附完整源码)
- The Zen of Python, by Tim Peters
- SQL调优:带函数的谓词导致CBO Cardinality计算误差
- debian dhcp服务启动不了_DHCP服务器配置
- 我最近在学微信小程序开发,一起吗?
- 一个 TypeScript keyof 泛型用法
- SQL Server中数据库文件的存放方式,文件和文件组
- oracle判断一个值不在记录中,Oracle: DELETE前不需SELECT判断记录是否存在,INSERT前不需SELECT判断是否有若干字段值重复的记录。...
- linux由哪些部分组成,linux内核处于什么位置?,Linux由几部分组成?Linux系统结构介绍!...
- 项目整体流程及项目经理工作职责
- Introduction to BouncyCastle with Java
- 世界杯数据清单:真球迷看球必备,伪球迷速成指南(附数据amp;论文)
- 微信小程序开发使用onreachBottom实现页面触底加载及分页
- python中int() 按照“四舍五入”的方式取整
- Eclipse SVN文件对比详解
- Vulnhub 靶机测试NO.30 hacksudo FOG
- 嵌入式系统概述1-嵌入式系统定义、特点和发展历程
- 关于小程序开发的一些资源
- OSPF建立邻居、邻接关系
热门文章
- Vue 中获取 package.json 信息
- 我的世界服务器怎么制作头颅,我的世界怎么刷生物头颅 我的世界生物头颅制作方法-游侠网...
- removeClass删除类名称
- 阿里云CTO章文嵩:阿里云强大的数据和计算能力助力企业实现“弯道超车”
- 解决V-Rep接近传感器(距离传感器、超声波传感器、红外传感器)不能正常识别问题
- CSS3:3D环绕实现
- ubuntu20.04安装并运行ORB_SLAM3(一路顺风版)
- pandas绘图plot函数
- vs助手使用期过 编译CEGUI的问题:error C2061: 语法错误: 标识符“__RPC__out_xcount_part” VS2010...
- 综述:环境中的噬菌体宿主互作