Seu código cria um novo MongoClient para cada um dos milhões de documentos em seu exemplo (assim como a pergunta à qual você vinculou). Isso requer que você abra um novo soquete para cada nova consulta. Isso anula o pool de conexões do PyMongo e, além de ser extremamente lento, também significa que você abre e fecha soquetes mais rápido do que sua pilha TCP pode acompanhar:você deixa muitos soquetes no estado TIME_WAIT e, eventualmente, fica sem portas.
Você pode criar menos clientes e, portanto, abrir menos soquetes, se inserir um grande número de documentos com cada cliente:
import multiprocessing as mp
import time
from pymongo import MongoClient
documents = [{"a number": i} for i in range(1000000)]
def insert_doc(chunk):
client = MongoClient()
db = client.mydb
col = db.mycol
col.insert_many(chunk)
chunk_size = 10000
def chunks(sequence):
# Chunks of 1000 documents at a time.
for j in range(0, len(sequence), chunk_size):
yield sequence[j:j + chunk_size]
time2s = time.time()
pool = mp.Pool(processes=16)
pool.map(insert_doc, chunks(documents))
pool.close()
pool.join()
time2f = time.time()
print(time2f - time2s)