python运行results = pool.map(face_recognize, numbers)报错_pickle.PicklingError: Can't pickle <function face_recognize at 0x7f8f0ca950>: attribute lookup face_recognize on __main__ failed
时间: 2024-03-28 09:38:55 浏览: 75
这个错误通常是由于pickle库无法序列化函数或方法而引起的。可能是因为你的函数face_recognize涉及到了一些无法序列化的对象。
你可以尝试使用dill库来替代pickle库,dill库可以处理更多的数据类型。你只需要将import pickle改为import dill即可。
另外,你也可以考虑将face_recognize函数定义在一个独立的.py文件中,然后在主文件中通过import语句来调用它,这样也可以避免这个错误。
相关问题
运行results = pool.map(face_recognize, numbers)报错AttributeError: Can't pickle local object 'RockxFaceRecognition.run.<locals>.face_recognize'
这个错误通常是由于 multiprocessing 库无法序列化某些对象引起的。在您的情况下,似乎是由于 `face_recognize` 函数中的某些本地对象无法序列化。
为了解决这个问题,您可以尝试将 `face_recognize` 函数定义为一个独立的函数,而不是在 `run` 方法内部定义的本地函数。或者,您可以使用 `dill` 库对 `face_recognize` 函数进行序列化和反序列化,以便 multiprocessing 库可以正确地处理它。
具体来说,您可以尝试使用以下代码:
```
import dill
def run(self):
# ...
with multiprocessing.Pool(processes=4) as pool:
results = pool.map(dill.loads(dill.dumps(face_recognize)), numbers)
# ...
```
使用 `dill.loads(dill.dumps(face_recognize))` 将 `face_recognize` 函数序列化并反序列化,从而允许 multiprocessing 库正确地处理它。
python运行results = pool.map(self.face_recognize, numbers)报错TypeError: Pickling an AuthenticationString object is disallowed for security reasons
这个错误通常出现在使用 Python 中的 `multiprocessing.Pool` 对象执行并行任务时,其中的任务涉及到了无法序列化的对象,例如 `AuthenticationString`。
在执行任务之前,`multiprocessing.Pool` 会将任务序列化,然后将其发送给子进程进行处理。但是,由于某些对象无法被序列化,因此就会出现这个错误。
为了解决这个问题,你可以考虑在执行任务之前,将涉及到的 `AuthenticationString` 对象转换为其他类型的对象,例如字符串或字节串。这样,`multiprocessing.Pool` 在序列化任务时就可以避免序列化这些敏感对象,从而避免出现安全问题。
具体来说,你可以将 `face_recognize` 函数中使用到的 `AuthenticationString` 对象转换为字符串或字节串,例如:
```python
def face_recognize(number):
# 将 AuthenticationString 对象转换为字符串或字节串
password = str(authentication_string)
...
```
或者,你也可以使用其他的并行计算库,例如 `concurrent.futures` 或 `joblib`,它们可以更好地处理一些无法被序列化的对象。
总之,为了保证代码的安全性和可靠性,你应该尽可能避免在并行计算中使用无法被序列化的对象,或者使用更加安全和可靠的并行计算库来代替 `multiprocessing.Pool`。
阅读全文