使用进程池时遇到的坑... TypeError: can‘t pickle _thread.lock objects

在使用多进程的进程池对我的爬虫程序进行处理时, 采用方式如下:

mymongo = myMongo()
lock = multiprocessing.Manager().Lock()
newMain = functools.partial(main, lock, mymongo)
pool = multiprocessing.Pool()
pool.map(newMain, [i for i in range(1000)])
pool.close()
pool.join()

当运行代码时, 抛出如下异常:

Traceback (most recent call last):
  File "/Users/vicshang/kepner/study/Tedu_AID1803/aid1803_kep/myutil/movieCommentsMaoyan.py", line 106, in <module>
    pool.map(newMain, [i for i in range(1000)])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/pool.py", line 644, in get
    raise self._value
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/pool.py", line 424, in _handle_tasks
    put(task)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
TypeError: can't pickle _thread.lock objects

后来查看发现, 进程池内部处理使用了pickle模块(用于python特有的类型和python的数据类型间进行转换)中的dump(obj, file, protocol=None,)方法对参数进行了封装处理.

出现这个问题是因为我在参数传递中传递了我自定义的数据库存储类mymongo, 造成进程池内部处理封装过程无法对其进行处理. 

解决办法, 在参数传递中, 去掉自定义的类mymongo, 而是将自定义类放到处理函数中去.

最近在处理机器学习模型时遇到了类似问题,也是因为pickle模块不支持自定义的类而异常。

解决方式是使用dill包来代替,使用方法和pickle一样,可点击跳转查看。


有趣有料有温度,和我一起学技术!

欢迎关注公众号 来思Go,收看更多赖克与甜甜的技术学习日常。

 

  • 8
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 14

打赏作者

翱翔的赖思

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值