ホームページ  >  記事  >  バックエンド開発  >  Pythonでのマルチプロセス実装を詳しく解説(例付き)

Pythonでのマルチプロセス実装を詳しく解説(例付き)

不言
不言転載
2018-10-20 14:56:094348ブラウズ

この記事では、Python でのマルチプロセスの実装について詳しく説明します (例付き)。一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。

fork 関数は子プロセスを作成します

基本的な使用法

Linux オペレーティング システムには、子プロセスを作成するための fork 関数が用意されています。子プロセス。 fork() は Python の os モジュールにあります。
インポートされた OS モジュールを使用するだけです。

import os
os.fork()

fork() 関数が呼び出されるたびに、対応する親プロセスが子プロセスを生成します。
たとえば、次のコード:

import os
os.fork()
os.fork()
os.fork()

実行後、8 つのプロセスが生成されます。

fork() 関数の戻り値

子プロセスの fork() 関数の戻り値は常に 0 ですが、子プロセスの戻り値は常に 0 です。親プロセスは子プロセスの PID (プロセス番号) です。

#例

#!/usr/bin/env python
import os
import time

rt = os.fork()

if rt == 0:
    print(f"The child process is {os.getpid()} . His father is {os.getppid()}")  # os.getpid()获取当前进程进程号,os.getppid()获取当前进程的父进程号
    time.sleep(5)
else:
    print(f"The father process is {os.getpid()} . His father is {os.getppid()}")
    time.sleep(5)

print(f"Now the process is {os.getpid()} . His father is {os.getppid()}")
実行結果:

Pythonでのマルチプロセス実装を詳しく解説(例付き)

##プロセスモジュール

#Import module

Python は、プラットフォーム全体にマルチスレッド プログラミングを提供するマルチプロセッシング ライブラリも提供します。

import multiprocessing

簡単なプロセス

次のコードは簡単なプロセスです:

from multiprocessing import Process


def work(num):
    for i in range(10):
        num += 1
    print(num)
    return 0


def main():
    num = 1
    p1 = Process(target = work, args = (num,))
    p1.start()


if __name__ == '__main__':
    main()

# # ここでは、マルチプロセッシング ライブラリから Process クラスが導入されています。 Pythonでのマルチプロセス実装を詳しく解説(例付き)p1 = Process(target = work, args = (num,)) はプロセスを作成します。 target はタスクを実行する関数であり、args は受け取ったパラメータであり、タプルの形式で指定する必要があります。 start() はプロセスを開始します。

同時処理にはいくつかの方法があります:



結合方法

Processの結合方法はマルチスレッドと似ています。プロセスが終了するのを待っています。 使用法: 参加(タイムアウト)。 join() を使用すると、プログラムはプロセスが終了するのを待ってから次のコードを続行します。

タイムアウトパラメータが追加された場合、プログラムはタイムアウト秒数待機してから次のプログラムの実行を続行します。



close メソッド

close() はプロセスを閉じるために使用されますが、実行中の子プロセスを閉じることはできません。

プロセス クラス

クラスを作成することで複数のプロセスを実装できます:

from multiprocessing import Process
import time


class My_Process(Process):

    def __init__(self,num):
        Process.__init__(self)
        self.num = num

    def run(self):
        time.sleep(2)
        print(self.num)


def main():
    for i in range(10):
        p = My_Process(i)
        p.start()


if __name__ == '__main__':
    main()

プロセス プール

from multiprocessing import Pool
import time


def target(num):
    time.sleep(2)
    print(num)


def main():
    pool = Pool(3)
    for i in range(3):
        pool.apply_async(target,(i,))
    pool.close()
    pool.join()
    print('Finish!!!')


if __name__ == '__main__':
    main()

Pool オブジェクトで join() メソッドを呼び出すと、すべての子プロセスが実行を完了するまで待機します。join() を呼び出す前に Close() を呼び出す必要があります。close() を呼び出した後は、新しいプロセスを追加できません。 Pool(num) の num は、それに追加されるプロセスの数です。プロセス数が指定されていない場合は、デフォルトの CPU コア数が使用されます。

プロセスは互いに独立しています

複数のプロセスの各プロセスは変数のコピーを持ち、プロセス間の操作は相互に影響しません。

import multiprocessing
import time

zero = 0

def change_zero():
    global zero
    for i in range(3):
        zero = zero + 1
        print(multiprocessing.current_process().name, zero)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target = change_zero)
    p2 = multiprocessing.Process(target = change_zero)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print(zero)
最終的な実行結果:

ファイル IO 操作が実行されると、複数のプロセスが同じファイルに書き込みます。 Pythonでのマルチプロセス実装を詳しく解説(例付き)

Queue

マルチプロセスで Queue を使用すると、異なるプロセスが同じリソースにアクセスできるようになります。 rreeee

以上がPythonでのマルチプロセス実装を詳しく解説(例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。