同時プログラミングでは、(コルーチンなどに加えて) マルチスレッドとマルチプロセスの 2 つのモードがよく使用されます。 CPython の GIL 制限 (Jython と IronPython には GIL がないため、PyPy は GIL を削除しようとしています) により、GIL を取得したスレッドのみが CPU を使用できるため、ブロックされる可能性のある一部の IO を処理する必要があることに加えて (ファイルの読み書き、ネットワークへのアクセスなど)、基本的には誰も CPython のマルチスレッドを使用しません。したがって、この記事では、より便利な Python マルチプロセス プログラミングについて説明します。
注: 推奨学習: Python ビデオ チュートリアル )
この記事で説明されている環境この記事は Linux オペレーティング システムでの CPython (ほとんどの POSIX システムにも適用可能) ですが、Windows オペレーティング システムやその他の Python 実装には適用できない可能性があります。
曖昧さを避けるため、以下では子プロセスを作成したプロセスを指すために「メインプロセス」または「現在のプロセス」を使用し、「xx の親プロセス」でない限り「親プロセス」は使用しません。明示的に指定されています。
マルチスレッド プログラミング時に呼び出し可能オブジェクトを渡す必要があるのとは異なり、マルチプロセス プログラミングでは、メイン プロセスが子プロセスにコピーされ、子プロセスに呼び出し可能オブジェクトの実行を直接要求することはできません。 。
POSIX システムでは、このコピー操作は clone() および fork() システム コールによって完了し、後者が一般的に使用されます。
fork() が正常に実行されると、メインプロセスと子プロセスでそれぞれ子プロセスの PID と 0 が返され、実行コードが異なるものになります。失敗した場合 (メモリ不足、PID が上限に達したなど)、子プロセスは作成されず、メイン プロセスは -1 を返し、errno には対応するエラー コードが設定されます。
CPython の実装では、os.fork() は主に fork() 関数のカプセル化です。違いは、失敗すると OSError がスローされることです。例外の errno 属性は、対応するエラー コードです。
したがって、マルチプロセス Python コードは大まかに次のようになります:
import os try: pid = os.fork() if pid == 0: # 子进程 # 子进程的代码 else: # 主进程 # 主进程的代码 except OSError: # 主进程处理 fork 失败的代码
Python 関連の技術記事の詳細については、Python チュートリアル##を参照してください。 # コラム 勉強しましょう!
以上がPython でマルチプロセス プログラミングを使用する場合の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。