Ich arbeite mit Python (2.7) und pymongo (3.3), und ich muss einen Kindprozess spawnen, um einen Job asynchron auszuführen. Leider ist Pymongo nicht Forksafe wie beschrieben here (und ich muss mit der Db interagieren, bevor ich den Child-Prozess erzeugen).Spawn einen Prozess in Python ohne Forking
lief ich ein Experiment mit subprocess.Popen
(mit shell
Set True
und dann False
) und multiprocessing.Process
. So weit ich sagen kann, geben beide den Parent-Prozess aus, um den Child-Prozess zu erstellen, aber nur multiprocessing.Process
bewirkt, dass Pymongo seine Warnung ausgibt, dass es einen gegabelten Prozess erkannt hat.
Ich frage mich, was die pythonische Art, dies zu tun ist. Es scheint, dass vielleicht os.system
wird es für mich tun, aber subprocess
ist als ein beabsichtigter Ersatz für os.system
beschrieben, so frage ich mich, ob ich etwas vermisse.
Aha macht Sinn. Ich war auch neugierig auf mögliche Nebenwirkungen von erben Dateideskriptoren (insbesondere Socket-Handles) im Kind-Prozess, aber ich denke, Popens close_fds Argument Adressen, die auch – nonagon
PyMongo erstellt seine Sockets mit FD_CLOEXEC, so dass diese Deskriptoren geschlossen sind, ob Sie close_fds übergeben oder nicht. –