Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse des von der Funktion fork() in Python generierten Unterprozesses

Analyse des von der Funktion fork() in Python generierten Unterprozesses

高洛峰
高洛峰Original
2016-10-18 10:02:311115Durchsuche

Das Betriebssystemmodul von Python verfügt über die Funktion fork() zum Generieren von untergeordneten Prozessen. Die generierten untergeordneten Prozesse sind Spiegelbilder des übergeordneten Prozesses, verfügen jedoch über eigene Adressräume. Der untergeordnete Prozess kopiert eine Kopie des Speichers des übergeordneten Prozesses , zwei Die Ausführung zwischen Prozessen ist unabhängig voneinander, und die Ausführungsreihenfolge kann unsicher, zufällig und unvorhersehbar sein, ähnlich der Ausführungsreihenfolge von Multithreads.

import os
def child():
    print 'A new child:', os.getpid()
    print 'Parent id is:', os.getppid()
    os._exit(0)
def parent():
    while True:
        newpid=os.fork()
        print newpid
        if newpid==0:
            child()
        else:
            pids=(os.getpid(),newpid)
            print "parent:%d,child:%d"%pids
            print "parent parent:",os.getppid()       
        if raw_input()=='q':
            break
parent()

Nachdem wir das OS-Modul geladen haben, generiert die Funktion fork() in unserer übergeordneten Funktion einen untergeordneten Prozess. Es gibt zwei Rückgabewerte newpid, einer ist 0, um den untergeordneten Prozess darzustellen, und der other ist Eine Ganzzahl größer als 0 wird zur Darstellung des übergeordneten Prozesses verwendet. Diese Konstante ist die PID des untergeordneten Prozesses. Wir können die beiden Rückgabewerte durch die print-Anweisung deutlich erkennen. Wenn der Rückgabewert von fork() ein negativer Wert ist, bedeutet dies, dass der untergeordnete Prozess nicht erfolgreich generiert wurde (diese Situation wird in diesem einfachen Programm nicht berücksichtigt). Wenn newpid == 0, bedeutet dies, dass wir den untergeordneten Prozess eingegeben haben, dh die Funktion child (). Im untergeordneten Prozess geben wir unsere eigene ID und die ID des übergeordneten Prozesses aus. Wenn die else-Anweisung eingegeben wird, bedeutet dies, dass newpid> 0 ist und wir den übergeordneten Prozess eingeben. Im übergeordneten Prozess erhält os.getpid() seine eigene ID. Der Rückgabewert von fork(), newpid, stellt die ID dar Gleichzeitig geben wir die ID des übergeordneten Prozesses aus. Durch Experimente können wir feststellen, dass die Ausführungsreihenfolge von untergeordneten und übergeordneten Prozessen ungewiss ist der Planungsalgorithmus des Betriebssystems.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn