Pythonビッグデータ Python上級(3)マルチプロセスの利用

複数のプロセスの使用

学習目標

  • 複数のプロセスを使用したマルチタスク機能

1 インポートプロセスパッケージ

#导入进程包
import multiprocessingCopy

2. Process プロセスクラスの説明

プロセス(グループ、ターゲット、名前、引数、kwargs)

  • group: プロセス グループを指定します。現在は「なし」のみを使用できます。
  • target: 実行するターゲットタスクの名前
  • 名前: プロセス名
  • args: 引数をタプル形式で実行タスクに渡します。
  • kwargs: パラメータを辞書形式で実行タスクに渡します

Process によって作成されるインスタンス オブジェクトの一般的なメソッド:

  • start(): サブプロセスインスタンスを開始します(サブプロセスを作成します)
  • join(): 子プロセスの実行が終了するのを待ちます。
  • terminate(): タスクが完了したかどうかに関係なく、子プロセスを直ちに終了します。

プロセスによって作成されるインスタンス オブジェクトの共通プロパティ:

name: 現在のプロセスのエイリアス、デフォルトは Process-N、N は 1 から増加する整数です

3. マルチタスクのマルチプロセス完了のコード

import multiprocessing
import time


# 跳舞任务
def dance():
    for i in range(5):
        print("跳舞中...")
        time.sleep(0.2)


# 唱歌任务
def sing():
    for i in range(5):
        print("唱歌中...")
        time.sleep(0.2)

if __name__ == '__main__':
    # 创建跳舞的子进程
    # group: 表示进程组,目前只能使用None
    # target: 表示执行的目标任务名(函数名、方法名)
    # name: 进程名称, 默认是Process-1, .....
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)

    # 启动子进程执行对应的任务
    dance_process.start()
    sing_process.start()Copy

結果:

唱歌中...
跳舞中...
唱歌中...
跳舞中...
唱歌中...
跳舞中...
唱歌中...
跳舞中...
唱歌中...
跳舞中...Copy

4. まとめ

  1. インポートプロセスパッケージ
    • インポートマルチプロセッシング
  2. サブプロセスを作成し、実行するタスクを指定します
    • sub_process = multiprocessing.Process (ターゲット=タスク名)
  3. タスクを実行するプロセスを開始する
    • sub_process.start()

プロセス番号を取得する

学習目標

  • プロセス番号を取得すればわかる

1. プロセス番号取得の目的

プロセス番号を取得する目的は、メインプロセスと子プロセスの関係を確認することであり、子プロセスがメインプロセスによって作成されたことを知ることができます。

プロセス番号を取得するための 2 つの操作

  • 現在のプロセス番号を取得する
  • 現在の親プロセス番号を取得します

2. 現在のプロセス番号を取得する

os.getpid() は現在のプロセス番号を取得することを意味します

サンプルコード:

import multiprocessing
import time
import os


# 跳舞任务
def dance():
    # 获取当前进程的编号
    print("dance:", os.getpid())
    # 获取当前进程
    print("dance:", multiprocessing.current_process())
    for i in range(5):
        print("跳舞中...")
        time.sleep(0.2)


# 唱歌任务
def sing():
    # 获取当前进程的编号
    print("sing:", os.getpid())
    # 获取当前进程
    print("sing:", multiprocessing.current_process())
    for i in range(5):
        print("唱歌中...")
        time.sleep(0.2)


if __name__ == '__main__':

    # 获取当前进程的编号
    print("main:", os.getpid())
    # 获取当前进程
    print("main:", multiprocessing.current_process())
    # 创建跳舞的子进程
    # group: 表示进程组,目前只能使用None
    # target: 表示执行的目标任务名(函数名、方法名)
    # name: 进程名称, 默认是Process-1, .....
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)

    # 启动子进程执行对应的任务
    dance_process.start()
    sing_process.start()Copy

結果:

main: 70763
main: <_MainProcess(MainProcess, started)>
dance: 70768
dance: <Process(myprocess1, started)>
跳舞中...
sing: 70769
sing: <Process(Process-2, started)>
唱歌中...
唱歌中...
唱歌中...
唱歌中...
唱歌中...Copy

3. 現在の親プロセス番号を取得します。

os.getppid() は、現在の親プロセス番号を取得することを意味します

サンプルコード:

import multiprocessing
import time
import os


# 跳舞任务
def dance():
    # 获取当前进程的编号
    print("dance:", os.getpid())
    # 获取当前进程
    print("dance:", multiprocessing.current_process())
    # 获取父进程的编号
    print("dance的父进程编号:", os.getppid())
    for i in range(5):
        print("跳舞中...")
        time.sleep(0.2)
        # 扩展:根据进程编号杀死指定进程
        os.kill(os.getpid(), 9)


# 唱歌任务
def sing():
    # 获取当前进程的编号
    print("sing:", os.getpid())
    # 获取当前进程
    print("sing:", multiprocessing.current_process())
    # 获取父进程的编号
    print("sing的父进程编号:", os.getppid())
    for i in range(5):
        print("唱歌中...")
        time.sleep(0.2)


if __name__ == '__main__':

    # 获取当前进程的编号
    print("main:", os.getpid())
    # 获取当前进程
    print("main:", multiprocessing.current_process())
    # 创建跳舞的子进程
    # group: 表示进程组,目前只能使用None
    # target: 表示执行的目标任务名(函数名、方法名)
    # name: 进程名称, 默认是Process-1, .....
    dance_process = multiprocessing.Process(target=dance, name="myprocess1")
    sing_process = multiprocessing.Process(target=sing)

    # 启动子进程执行对应的任务
    dance_process.start()
    sing_process.start()Copy
main: 70860
main: <_MainProcess(MainProcess, started)>
dance: 70861
dance: <Process(myprocess1, started)>
dance的父进程编号: 70860
跳舞中...
sing: 70862
sing: <Process(Process-2, started)>
sing的父进程编号: 70860
唱歌中...
唱歌中...
唱歌中...
唱歌中...
唱歌中...Copy

4. まとめ

  • 現在のプロセス番号を取得する
    • os.getpid()
  • 現在の親プロセス番号を取得します
    • os.getppid()
  • プロセス番号を取得して、親プロセスと子プロセスの関係を表示します。

プロセスはパラメータを指定してタスクを実行します

学習目標

  • パラメータを使用してタスクを実行するプロセスを作成する機能

1. パラメータを使用してタスクを実行するプロセスの概要

プロセスを使用して以前に実行したタスクにはパラメータがありません。プロセスを使用して実行したタスクにパラメータがある場合、関数にパラメータを渡すにはどうすればよいでしょうか?

Process クラスがタスクを実行し、タスクにパラメーターを渡すには 2 つの方法があります。

  • args は、タプルの形式で実行タスクにパラメータを渡すことを意味します。
  • kwargs は、辞書の形式で実行タスクにパラメータを渡すことを意味します

2. args パラメータの使用

サンプルコード:

import multiprocessing
import time


# 带有参数的任务
def task(count):
    for i in range(count):
        print("任务执行中..")
        time.sleep(0.2)
    else:
        print("任务执行完成")


if __name__ == '__main__':
    # 创建子进程
    # args: 以元组的方式给任务传入参数
    sub_process = multiprocessing.Process(target=task, args=(5,))
    sub_process.start()Copy

結果:

任务执行中..
任务执行中..
任务执行中..
任务执行中..
任务执行中..
任务执行完成Copy

3. kwargs パラメータの使用

サンプルコード:

import multiprocessing
import time


# 带有参数的任务
def task(count):
    for i in range(count):
        print("任务执行中..")
        time.sleep(0.2)
    else:
        print("任务执行完成")


if __name__ == '__main__':
    # 创建子进程

    # kwargs: 表示以字典方式传入参数
    sub_process = multiprocessing.Process(target=task, kwargs={
    
    "count": 3})
    sub_process.start()Copy

結果:

任务执行中..
任务执行中..
任务执行中..
任务执行完成Copy

4. まとめ

  • プロセスがタスクを実行してパラメータを渡すには、次の 2 つの方法があります。
    • タプル モードで渡すパラメータ (args) : タプル モードで渡すパラメータは、パラメータの順序と一致している必要があります。
    • 辞書モードでパラメータを渡す (kwargs) : 辞書モードでパラメータを渡すときは、辞書内のキーがパラメータ名と一致している必要があります。

Guess you like

Origin blog.csdn.net/xianyu120/article/details/133386960