【发布时间】: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