bifurcação de multiprocessamento () vs spawn ()
Eu estava lendo a descrição dos dois no documento python :
desova
O processo pai inicia um novo processo de interpretador python. O processo filho herdará apenas os recursos necessários para executar o método run () dos objetos de processo. Em particular, os descritores e identificadores de arquivo desnecessários do processo pai não serão herdados. Iniciar um processo usando este método é bastante lento em comparação com o uso de fork ou forkserver. [Disponível em Unix e Windows. O padrão no Windows e macOS.]
garfo
O processo pai usa os.fork () para bifurcar o interpretador Python. O processo filho, quando começa, é efetivamente idêntico ao processo pai. Todos os recursos do pai são herdados pelo processo filho. Observe que bifurcar com segurança um processo multithread é problemático. [Disponível apenas no Unix. O padrão no Unix.]
E minha pergunta é:
- será que o fork é muito mais rápido porque não tenta identificar quais recursos copiar?
- será que, uma vez que fork duplica tudo, "desperdiçaria" muito mais recursos em comparação com spawn ()?
Respostas
- será que o fork é muito mais rápido porque não tenta identificar quais recursos copiar?
Sim, é muito mais rápido. O kernel pode clonar todo o processo e apenas copiar as páginas de memória modificadas como um todo . Não é necessário canalizar recursos para um novo processo e inicializar o interpretador do zero.
- será que, uma vez que fork duplica tudo, "desperdiçaria" muito mais recursos em comparação com spawn ()?
Fork em kernels modernos faz apenas "cópia na gravação" e afeta apenas as páginas de memória que realmente mudam. A ressalva é que "escrever" já engloba meramente a iteração sobre um objeto no CPython. Isso ocorre porque a contagem de referência para o objeto é incrementada.
Se você tiver processos de longa execução com muitos objetos pequenos em uso, isso pode significar que você desperdiça mais memória do que com o spawn. Curiosamente, lembro-me do Facebook alegando ter reduzido consideravelmente o uso de memória com a mudança de "fork" para "spawn" para seus processos Python.