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

这篇具有很好参考价值的文章主要介绍了【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 time


def single_test():
    my_sum = 0
    for i in range(1, 10000000):
        my_sum += i
    print("单线程结果:", my_sum)


def thread_test():

    def sum_func(q, start, end):
        my_sum = 0
        for i in range(start, end):
            my_sum += i
        q.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 = 0
        while not q.empty():
            my_sum += q.get()
        print("多线程结果:", my_sum)

    run_thread()


def process_test():

    def sum_process_func(q, start, end):
        my_sum = 0
        for i in range(start, end):
            my_sum += i
        q.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 = 0
        while 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 time


def single_test():
    my_sum = 0
    for i in range(1, 10000000):
        my_sum += i
    print("单线程结果:", my_sum)


def thread_test():

    def sum_func(q, start, end):
        my_sum = 0
        for i in range(start, end):
            my_sum += i
        q.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 = 0
        while not q.empty():
            my_sum += q.get()
        print("多线程结果:", my_sum)

    run_thread()


def sum_process_func(q, start, end):
        my_sum = 0
        for i in range(start, end):
            my_sum += i
        q.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 = 0
        while 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文章来源地址https://www.toymoban.com/news/detail-434767.html

到了这里,关于【Python】多进程 AttributeError: Can‘t pickle local object的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 中出现AttributeError: ‘Event‘ object has no attribute ‘key‘

    《python编程从入门到实践》中在学习外星人入侵项目中运行程序时出现报错 AttributeError: \\\'Event\\\' object has no attribute \\\'key\\\' 错误代码如下: 运行错误提示 导致错误的原因为“ #按Q键退出游戏”这部分程序中“elif event.key == pygame.K_q:”这句语句写在了与 事件类型 “event.type == pygame

    2024年02月11日
    浏览(75)
  • Python 中 AttributeError: ‘NoneType‘ object has no attribute ‘X‘ 错误

    Python “ AttributeError: ‘NoneType’ object has no attribute ” 发生在我们尝试访问 None 值的属性时,例如 来自不返回任何内容的函数的赋值。 要解决该错误,请在访问属性之前更正分配。 这是一个非常简单的示例,说明错误是如何发生的。 尝试访问或设置 None 值的属性会导致错误

    2024年02月06日
    浏览(39)
  • 【python|OpenCV】AttributeError: ‘NoneType‘ object has no attribute ‘shape‘

    当使用OpenCV出现这个错误时,但是又没有中文路径或者路径的错误时,可能是版本没有对上,或者是其他的问题,我也用过很多博主的办法,但是都没办法解决的时候,真的可以试一下 直接删除,再重新下载。 目录 情况描述 我的做法 感想 留言 本来我使用的是版本是4.7.0,

    2024年02月03日
    浏览(34)
  • 【Python】成功解决AttributeError: ‘list‘ object has no attribute ‘replace‘

    【Python】成功解决AttributeError: ‘list’ object has no attribute ‘replace’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多

    2024年03月25日
    浏览(42)
  • 【Python】成功解决AttributeError: ‘list‘ object has no attribute ‘split‘

    【Python】成功解决AttributeError: ‘list‘ object has no attribute ‘split‘ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多关

    2024年04月14日
    浏览(54)
  • 编写Python 代码出现 AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘ 报错

    在编写如下 python 代码过程中出现: AttributeError: ‘DataFrame’ object has no attribute ‘ix’ 错误截图: 中文意思: “DataFrame”对象没有属性“ix” 原因是,pandas 的 ‘ix’ 属性已经在最新版本中被弃用了。 pandas的新版本已经对该函数进行了升级和重构,可以使用( ‘loc’–可以

    2024年02月15日
    浏览(46)
  • 解决 Python 中 AttributeError: ‘list‘ object Attribute ‘append‘ Is Read-Only 错误

    在 Python 中使用列表时,我们可以对数据类型运行不同的操作(方法)。 我们必须了解它们的工作原理,才能有效且无误地使用它们。 要使用这些方法,我们需要知道它们的语法、错误和操作模式。 append() 方法是众多方法中的一种,它可以帮助我们将新元素添加到列表中。

    2024年04月10日
    浏览(50)
  • AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘解决方案【Bug已解决-Python】

    本文主要介绍了AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘解决方案,希望能对大家有所帮助。 今天在运行项目时,却出现AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘的错误提示,具体报错信息如下所示: AttributeError: ‘DataFrame‘ object has no attribute ‘i

    2024年03月23日
    浏览(73)
  • Python产生关键词云报错:AttributeError: ‘ImageDraw‘ object has no attribute ‘textbbox‘

    利用jieba snownlp分别分词,产生云。代码报错,检查了以下代码没错。 最后在csdn找到了解决方法。 这原来是pillow的版本过低的原因。 办法如下: 打开Anaconda prompt查看下载列表: pip  list   删除现有的pillow:  pip uninstall pillow  下载新版本的pillow: pip install pillow 推荐用

    2024年02月12日
    浏览(44)
  • 【Python】成功解决AttributeError: ‘numpy.ndarray’ object has no attribute ‘value_counts’

    【Python】成功解决AttributeError: ‘numpy.ndarray’ object has no attribute ‘value_counts’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+

    2024年04月11日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包