【问题标题】:Python Multiprocessing - cannot pickle '_thread.lock' objectPython多处理 - 无法腌制'_thread.lock'对象
【发布时间】:2021-07-06 08:48:16
【问题描述】:

我正在尝试使用 twint 从 twitter 获取数据帖子,为了使其更快,我正在使用多处理来并行获取所有用户的所有数据。 出于某种原因,我总是收到错误:

cannot pickle '_thread.lock' object

我找不到解决方法。我尝试使用“线程”,但由于某种原因,它没有给我完整的数据,而且每次都给我不同的结果。

谢谢!

for 循环比创建这样的进程:

p1 = multiprocessing.Process(target=my_func, args=(current_user, collection, posts_list,))
proc.append(p1)
p1.start()

在 for 循环之后为每个进程“加入”执行操作。

【问题讨论】:

  • 我猜你有一个对象锁定了你正在传递你用multiprocessing创建的进程,你不能这样做。您不能将任何内容传递给进程(因为它使用pickle 来序列化它们)。也许发布您正在使用的代码,以便更清楚您在做什么
  • 我很难发布代码,因为它非常笨拙。我正在发送一个函数三个变量,函数的目标是返回每个用户和用户的所有帖子 - 所有帖子都将进入一个列表。
  • 你可能在current_user/collection/posts_list里面的某个地方有一些lock
  • 这是什么意思?我该如何解决?

标签: python multithreading python-multiprocessing


【解决方案1】:

您必须删除您可能在其中一个参数中拥有的锁,因为lock 是一个无法腌制的对象。多处理使用(顾名思义)多个进程,并且传递给进程的参数使用pickle

因此,您可以删除锁定对象,或者在酸洗时忽略它。您可以参考this 的帖子进行操作

【讨论】:

  • 我发现问题在于收藏。我正在使用收藏来更新数据库并上传今天的所有帖子。那有什么问题?
  • 是的,当用作数据库管理器时(至少在我的情况下,MongoDB 及其 python 驱动程序 pymongo),最好将光标直接传递给将要并行化的函数,而不是传递它作为论据。
【解决方案2】:

由于您发布的描述有限,我们无法提供有关错误的更多信息。这应该与其他人提到的lock 相关。

但我猜你是在 Windows 上运行你的程序。在 Windows 上运行多处理可能会出现一些错误。 Windows 系统无法进行 Unix 系统用来创建新进程的 fork。如果您还看到spawn xxx 之类的错误信息,那么我认为这可能是在 Windows 上运行的多处理程序的错误。但我目前没有解决方案。等待其他人提供解决方案。

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 2016-10-22
    • 2017-10-23
    • 1970-01-01
    • 2017-12-18
    • 2021-06-17
    • 2021-05-30
    • 2021-05-16
    • 2019-05-11
    相关资源
    最近更新 更多