Часто встречающиеся проблемы и пути их устранения#

Использование клиента Python gRPC с multiprocessing#

Контекст#

При использовании клиента Python gRPC с multiprocessing можете столкнуться с ошибкой вида:

<_InactiveRpcError of RPC that terminated with:
  status = StatusCode.UNAVAILABLE
  details = "sendmsg: Socket operation on non-socket (88)"
  debug_error_string = "UNKNOWN:Error received from peer  {grpc_message:"sendmsg: Socket operation on non-socket (88)", grpc_status:14, created_time:"....."}"

Решение#

Данная ошибка возникает потому, что multiprocessing создает копии каналов gRPC, которые совместно используют один сокет. Когда родительский процесс закрывает канал, он закрывает сокет, а дочерние процессы пытаются использовать закрытый сокет.

Чтобы предотвратить эту ошибку, можно использовать методы запуска forkserver или spawn для multiprocessing.

import multiprocessing

multiprocessing.set_start_method("forkserver")  # or "spawn"    

В качестве альтернативы перейдите и к использованию API REST, асинхронного клиента или встроенных средств параллелизации в клиенте Python - функций вроде qdrant.upload_points(...)