Pythonマルチプロセス利用例(コード)

不言
リリース: 2018-09-19 16:41:58
オリジナル
1901 人が閲覧しました

この記事の内容はPythonマルチプロセスの使用例(コード)に関するもので、ある程度の参考価値はありますので、困っている方は参考にしていただければ幸いです。

Python マルチスレッドは、IO 集中型のシナリオには適していますが、CPU 集中型のシナリオでは、マルチコア CPU を十分に活用できません。コルーチンは本質的にスレッドベースであり、マルチコアの利点を十分に活用できません。 。

複数のプロセスの使用を必要とするコンピューティング集約型のシナリオの場合、Python のマルチプロセッシングはスレッド モジュールに非常に似ており、プロセス プールを使用した子プロセスのバッチ作成をサポートします。

  • 単一の Process プロセスを作成する (func を使用)

Process クラスをインスタンス化し、関数をターゲット パラメーターに渡すだけです。これはスレッド モジュールと同じです。非常に似ています。args は関数のパラメータです。

import os
from multiprocessing import Process

# 子进程要执行的代码
def task(name):
    print('run child process %s (%s)...' % (name, os.getpid()))

if __name__ == '__main__':
    print('parent process %s.' % os.getpid())
    p = Process(target=task, args=('test',))
    p.start()
    p.join()
    print('process end.')
ログイン後にコピー

  • #単一の Process プロセスを作成します (クラスを使用) )

Process クラスを継承し、run メソッドをオーバーライドしてプロセスを作成します。これは基本的にスレッド モジュールと同じです

#

import multiprocessing
import os
from multiprocessing import current_process
class Worker(multiprocessing.Process):
    def run(self):
        name = current_process().name  # 获取当前进程的名称
        print(&#39;run child process <%s>  (%s)&#39; % (name, os.getpid()))

        print(&#39;In %s&#39; % self.name)
        return

if __name__ == &#39;__main__&#39;:
    print(&#39;parent process %s.&#39; % os.getpid())
    p = Worker()
    p.start()
    p.join()
    print(&#39;process end.&#39;)
ログイン後にコピー

* プロセスを停止する

## terminate() は子プロセスを終了しますが、子プロセスのリソースは解放できません。終了してしまうため、子スレッドが不適切なタイミングで終了する可能性が高くなります。

import multiprocessing
import time

def worker():
    print(&#39;starting worker&#39;)
    time.sleep(0.1)
    print(&#39;finished worker&#39;)

if __name__ == &#39;__main__&#39;:
    p = multiprocessing.Process(target=worker)
    print(&#39;执行前:&#39;, p.is_alive())
    p.start()
    print(&#39;执行中:&#39;, p.is_alive())
    p.terminate()  # 发送停止号
    print(&#39;停止:&#39;, p.is_alive())
    p.join()
    print(&#39;等待完成:&#39;, p.is_alive())
ログイン後にコピー

    複数の Process プロセスを直接作成する
import multiprocessing

def worker(num):
    print(f&#39;Worker:%s %s&#39;, num)
    return

if __name__ == &#39;__main__&#39;:
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()
ログイン後にコピー

    プロセス プールを使用して複数のプロセスを作成する
  • システム管理に Python を使用する場合、特に複数のファイル ディレクトリを同時に操作する場合、またはリモート複数のホストと並列操作を制御すると、時間を大幅に節約できます。操作するオブジェクトの数が多くない場合は、マルチプロセッシングのProcessを直接使用することで複数のプロセスを動的に生成することができます 十数個なら大丈夫ですが、対象が数百、数千個になると手動で制限するには多すぎますプロセスの数が面倒な場合は、この時点でプロセス プールを使用することもできます。
プールは、ユーザーが呼び出せる指定された数のプロセスを提供できます。新しいリクエストがプールに送信されると、プールがいっぱいでない場合は、リクエストを実行するために新しいプロセスが作成されます。ただし、プールがプロセス数が指定された最大値に達すると、リクエストはプール内のプロセスが終了するまで待機し、その後、それを処理する新しいプロセスが作成されます。


#

import os
import random
import time
from multiprocessing import Pool
from time import ctime


def task(name):
    print(&#39;start task %s (%s)...&#39; % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)

    print(&#39;end task %s runs %0.2f seconds.&#39; % (name, (time.time() - start)))


if __name__ == &#39;__main__&#39;:
    print(&#39;parent process %s.&#39; % os.getpid())

    p = Pool()  # 初始化进程池
    for i in range(5):
        p.apply_async(task, args=(i,))  # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

    p.close()

    p.join()  # 等待所有结果执行完毕,会等待所有子进程执行完毕,调用join()之前必须先调用close()
    print(f&#39;all done at: {ctime()}&#39;)
ログイン後にコピー

#各プロセスの実行結果が気になる場合は、get メソッドを使用して結果を返すことができます。コードは次のとおりです

import os
import random
import time
from multiprocessing import Pool, current_process
from time import ctime


def task(name):
    print(&#39;start task %s (%s)...&#39; % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    print(&#39;end task %s runs %0.2f seconds.&#39; % (name, (time.time() - start)))

    return current_process().name + &#39;done&#39;

if __name__ == &#39;__main__&#39;:
    print(&#39;parent process %s.&#39; % os.getpid())

    result = []

    p = Pool()  # 初始化进程池
    for i in range(5):
        result.append(p.apply_async(task, args=(i,)))  # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

    p.close()

    p.join()  # 等待所有结果执行完毕

    for res in result:
        print(res.get())  # get()函数得出每个返回结果的值

    print(f&#39;all done at: {ctime()}&#39;)
ログイン後にコピー

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート