ホームページ  >  記事  >  バックエンド開発  >  Pythonのfork()関数で生成されるサブプロセスの解析

Pythonのfork()関数で生成されるサブプロセスの解析

高洛峰
高洛峰オリジナル
2016-10-18 10:02:311080ブラウズ

Python の os モジュールには、子プロセスを生成するための fork() 関数があります。生成された子プロセスは親プロセスのミラー イメージですが、子プロセスは親プロセスのメモリのコピーをそれ自体にコピーします。 2 つのプロセス 実行は互いに独立しており、その実行順序はマルチスレッドの実行順序と同様に、不確実でランダムで予測不可能になる可能性があります。

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()

OS モジュールをロードした後、親関数の fork() 関数は 2 つの戻り値 newpid を生成します。1 つは子プロセスを表すために使用される 0 で、もう 1 つは です。親プロセスを表すために使用される 0 より大きい整数。この定数は子プロセスの pid です。print ステートメントを通じて 2 つの戻り値を明確に確認できます。 fork() の戻り値が負の値である場合、それは子プロセスが正常に生成されなかったことを示します (この状況はこの単純なプログラムでは考慮されていません)。 newpid==0 の場合、子プロセス、つまり child() 関数に入ったことを意味します。子プロセスでは、自分自身の ID と親プロセスの ID が出力されます。 else ステートメントが入力された場合、それは newpid>0 を意味し、親プロセスに入ります。親プロセスでは、os.getpid() が独自の ID を取得します。fork() の戻り値 newpid は、その ID を表します。同時に、親プロセスの親プロセスの ID も出力します。 実験を通じて、子プロセスと親プロセスの実行順序は不確実であることがわかります。オペレーティング システムのスケジューリング アルゴリズム。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。