【问题标题】:TypeError: cannot pickle '_thread.lock' object while using pool.map over a methodTypeError: 在方法上使用 pool.map 时无法 pickle \'_thread.lock\' 对象
【发布时间】:2022-12-12 06:07:56
【问题描述】:

我有一个 Iterables 的列表,我想将 pool.map 与实例方法一起使用。问题是上述方法没有运行,我收到以下错误。

代码:

def return_brands_of_product(self,product):
        if product['_source']['brand_id'] != "" and product['_source']['brand_id'] not in self.brands_ids:
            self.brands.append({"brand_id":product['_source']['brand_id'],"name":product['_source']['brand'][0]['name']
                                ,"en_name":product['_source']['brand'][0]['en_name']})
            self.brands_ids.append(product['_source']['brand_id'])

instance = GenerateBrandsFromCategories(cat['_id'])
products = instance.return_products_by_cat_id()
pool.map(instance.return_brands_of_product, products)

错误:

Traceback (most recent call last):
  File "fetch_brands_from_products.py", line 165, in <module>
    main()
  File "fetch_brands_from_products.py", line 161, in main
    a=pool.map(ins, products)
  File "/usr/lib/python3.8/multiprocessing/pool.py", line 364, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/usr/lib/python3.8/multiprocessing/pool.py", line 771, in get
    raise self._value
  File "/usr/lib/python3.8/multiprocessing/pool.py", line 537, in _handle_tasks
    put(task)
  File "/usr/lib/python3.8/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib/python3.8/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
TypeError: cannot pickle '_thread.lock' object

【问题讨论】:

  • 我不能确定,但​​我不认为你被允许将类方法传递给多处理,因为它会丢失它引用的类并且不再有任何意义。我认为您需要将需要使用的信息分别传递到函数中,并弄清楚如何将返回的数据添加到您的类中。您可以传递一个用 @staticmethod 装饰的方法,因为它不需要类引用,但这确实意味着您需要传递参数中的所有数据并从函数的返回值中获取值。
  • 由于某些变量,我的代码主体中需要 self 。

标签: python python-3.x mapping multitasking


【解决方案1】:

我在编写的某些代码中遇到了类似的问题。最简单的解决方法是:

def runner(product):
    instance = GenerateBrandsFromCategories(cat['_id']) 
    instance.return_brands_of_product(product)

...
pool.map(runner, products)

在我的例子中,为每个线程重新创建实例很便宜。

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 2017-12-04
    • 2022-12-22
    • 2017-12-18
    • 2021-05-30
    • 2021-05-16
    • 2019-05-11
    • 2019-10-20
    相关资源
    最近更新 更多