fourche multitraitement () vs spawn ()

Sep 28 2020

Je lisais la description des deux dans la doc python :

frayer

Le processus parent démarre un nouveau processus d'interprétation python. Le processus enfant n'héritera que des ressources nécessaires pour exécuter la méthode run () des objets de processus. En particulier, les descripteurs et descripteurs de fichiers inutiles du processus parent ne seront pas hérités. Le démarrage d'un processus en utilisant cette méthode est plutôt lent par rapport à l'utilisation de fork ou forkserver. [Disponible sous Unix et Windows. Valeur par défaut sous Windows et macOS.]

fourchette

Le processus parent utilise os.fork () pour dériver l'interpréteur Python. Le processus enfant, lorsqu'il commence, est en fait identique au processus parent. Toutes les ressources du parent sont héritées par le processus enfant. Notez que forger en toute sécurité un processus multithread est problématique. [Disponible sous Unix uniquement. La valeur par défaut sous Unix.]

Et ma question est:

  1. est-ce que le fork est beaucoup plus rapide parce qu'il n'essaye pas d'identifier les ressources à copier?
  2. est-ce que, puisque fork duplique tout, il "gaspillerait" beaucoup plus de ressources que spawn ()?

Réponses

3 Darkonaut Sep 28 2020 at 12:25
  1. est-ce que le fork est beaucoup plus rapide parce qu'il n'essaye pas d'identifier les ressources à copier?

Oui, c'est beaucoup plus rapide. Le noyau peut cloner tout le processus et ne copie que les pages mémoire modifiées dans leur ensemble . Il n'est pas nécessaire de diriger les ressources vers un nouveau processus et de démarrer l'interpréteur à partir de zéro.

  1. est-ce que, puisque fork duplique tout, il "gaspillerait" beaucoup plus de ressources que spawn ()?

Fork sur les noyaux modernes ne fait que "copie sur écriture" et n'affecte que les pages mémoire qui changent réellement. La mise en garde est que "écrire" englobe déjà simplement l'itération sur un objet en CPython. C'est parce que le nombre de références de l'objet est incrémenté.

Si vous avez des processus de longue durée avec beaucoup de petits objets en cours d'utilisation, cela peut signifier que vous gaspillez plus de mémoire qu'avec spawn. De façon anecdotique, je me souviens que Facebook prétendait avoir réduit considérablement l'utilisation de la mémoire avec le passage de "fork" à "spawn" pour leurs processus Python.