Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのfork()関数で子プロセスを作成する方法

この記事では、Pythonのfork()関数を使用して子プロセスを作成し、親プロセスと子プロセスそれぞれのプロセスIDを表示する方法を解説します。

fork()とは

fork()を呼び出すと、呼び出し元のプロセス自身のコピーが作成されます。これはLINUXやUNIXシステムにおいて非常に重要な仕組みです。fork()は主にマルチプロセス環境で活用され、親プロセスの実行内容が複製され、そこから子プロセスが生成されます。

戻り値の挙動は以下のとおりです。

  • 負の値:エラーが発生したことを示します
  • 0:子プロセス側で実行していることを示します
  • 正の値:親プロセス側で実行していることを示します

fork()osモジュール、または擬似端末を扱うptyモジュールから利用できます。そのため、使用前にosまたはptyをインポートしておく必要があります。

fork()は引数を受け取らず、プロセスIDを返します。使用する主な目的は、呼び出し元の子プロセスとなる新しいプロセスを作成することです。新しい子プロセスが生成されると、親と子の両方のプロセスが次の命令から実行を続けます。

fork()の戻り値を確認することで、現在どちらのプロセスで処理しているかを判別できます。0が返れば子プロセス内、正の値が返れば親プロセス内、負の値が返ればエラーが発生したことを意味します。

os.fork()を使ったサンプルコード

import os

def parentchild():
    n = os.fork()
    if n > 0:
        print("親プロセスID : ", os.getpid())
    else:
        print("子プロセスID : ", os.getpid())

# 実行コード
parentchild()

出力結果

親プロセスID : 8023
子プロセスID : 8024
$

pty.fork()を使ったサンプルコード

擬似端末ユーティリティモジュールであるptyは、擬似端末(pseudo-terminal)の概念を扱うために定義されたモジュールです。これを使用すると、別のプロセスを起動したり、制御端末との間でプログラム経由の読み書きを行ったりすることができます。

なお、このモジュールはプラットフォームに強く依存するため、これらの操作を実行するにはUNIX系システムが必要です。

import pty, os

def process_parent_child():
    (process_id, fd) = pty.fork()
    print("現在のプロセスID: " + str(os.getpid()))
    print("子プロセスID: " + str(process_id))

process_parent_child()

出力結果

現在のプロセスID: 12508
子プロセスID: 12509
  1. PythonとSeleniumでWhatsAppチャットボットを作る方法

    はじめに この記事では、Pythonを使ってWhatsAppのチャットボットを作成する方法を解説します。TwitterやFacebook向けの一般的なチャットボットとは異なり、WhatsAppは運営ポリシーの関係上、プラットフォーム上で直接ボットを動かすことができません。 しかし、SeleniumというPythonの強力なパッケージを使えば、ブラウザの操作を自動化することでこれを実現できます。Seleniumを利用すれば、ブラウザ経由で「WhatsApp Web」を自由に操作できるのです。 必要なもの 準備が必要なのは、主に以下の3点です。 1. Selenium Seleniumはpip

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c