Qual é a diferença entre ThreadPool vs Pool no módulo de multiprocessamento Python

Qual é a diferença entreThreadPool ePool nomultiprocessing módulo. Quando tento meu código, esta é a principal diferença que vejo:

from multiprocessing import Pool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = Pool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

Eu vejo a seguinte saída:

hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
inside hello()
Proccess id:  13268
inside hello()
Proccess id:  11104
inside hello()
Proccess id:  13064
[0, 1, 4]

Com "ThreadPool":

from multiprocessing.pool import ThreadPool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = ThreadPool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

Eu vejo a seguinte saída:

hi outside of main()
inside hello()
inside hello()
Proccess id:  15204
Proccess id:  15204
inside hello()
Proccess id:  15204
[0, 1, 4]

Minhas perguntas são:

por que o "domínio externo __ ()" é executado sempre quePool?

multiprocessing.pool.ThreadPool não gera novos processos? Ele apenas cria novos tópicos?

Em caso afirmativo, qual é a diferença entre usarmultiprocessing.pool.ThreadPool ao contrário de apenasthreading módulo?

Não vejo nenhuma documentação oficial paraThreadPool em qualquer lugar, alguém pode me ajudar onde eu posso encontrar?

questionAnswers(1)

yourAnswerToTheQuestion