Python: Inter-thread communication & use of multi-process

スレッド間通信
スレッドは時に通信する必要があります。オペレーティングシステムはプロセス間通信を実現するために多くの仕組みを提供しており、その中でも最もよく使用するのがキュー (Queue) です。典型的な例:プロデューサとコンシューマ。

Queue の原理
Queue は先入れ先出し (First In First Out) のキューです。Queue オブジェクトをメインプロセスで作成し、パラメータとして子プロセスに渡します。put() でデータを投入し、get() でデータを取り出します。get() の実行後、キュー内のデータは同時に削除されます。multiprocessing モジュールの Queue を使用することで、複数のプロセス間でデータを転送できます。
image.png

import threading, queue
import time


def produce():
for i in range(10):
time. sleep(0.5)
print('生産++++++パン {} {}'.format(threading.current_thread().name, i))
q.put('{}{}'.format(threading.current_thread().name, i))


def consumer():
while True:
time. sleep(1)
# q.get() メソッドはブロッキングメソッドです
print('{} が購入------パン{}'.format(threading.current_thread().name, q.get()))


q = queue.Queue() # Queue オブジェクトを作成

# 生産ライン
pa = threading.Thread(target=produce, name='pa')
pb = threading.Thread(target=produce, name='pb')
pc = threading.Thread(target=produce, name='pc')

# 消費ライン
ca = threading.Thread(target=consumer, name='ca')
cb = threading.Thread(target=consumer, name='cb')
cc = threading.Thread(target=consumer, name='cc')

pa. start()
pb. start()
pc. start()

ca. start()
cb. start()
cc. start()

マルチプロセスの利用
プロセス
プログラム:たとえば xxx.py はプログラムであり、静的な存在です。

プロセス:プログラムが実行されると、コード + 使用されるリソースがプロセスと呼ばれ、オペレーティングシステムによるリソース割り当ての基本単位となります。

マルチタスキングはスレッドだけでなく、プロセスでも実現できます。

プロセスの状態
処理において、タスク数が CPU コア数より多い場合がよくあります。つまり、あるタスクは実行中で、別のタスクは CPU による実行を待っているため、異なる状態が生じます。

準備完了状態:実行条件を満たしており、CPU での実行を待っている状態です。
実行状態:CPU が関数を実行している状態です。
待機状態:特定の条件が満たされるのを待っている状態です。たとえば、プログラムがスリープしている場合、このとき待機状態にあります。
プロセスの作成
multiprocessing モジュールはクロスプラットフォーム対応のマルチプロセスモジュールです。プロセスを表す Process クラスを提供しています。このオブジェクトは、他の処理を実行できる独立したプロセスと理解できます。
子プロセスを作成する際は、実行関数と関数パラメータを渡すだけで、Process インスタンスを作成し、start() メソッドで起動します。

import multiprocessing, time, os


def dance(n):
for i in range(n):
time. sleep(0.5)
print('ダンス {}, pid={}'.format(i, os.getpid()))


def sing(m):
for i in range(m):
time. sleep(0.5)
print('歌 {}, pid={}'.format(i, os.getpid()))


if __name__ == '__main__':
print('メインプロセスの pid={}'.format(os.getpid()))
# 2 つのプロセスを作成
# target は実行するタスクを指定します
# args はパラメータを渡すために使用します。型はタプルです
p1 = multiprocessing.Process(target=dance, args=(100,))
p2 = multiprocessing.Process(target=sing, args=(100,))

p1. start()
p2. start()
メソッドの説明

Process(target [, name [, args [, kwargs]]])
target:関数参照を渡すと、子プロセスにこのコードを実行させることができます
args:target で指定した関数に渡すパラメータ。タプルで渡します
kwargs:target で指定した関数に名前付きパラメータを渡します
name:プロセスの名前を設定します。省略可能です
Process で作成したインスタンスオブジェクトの一般的なメソッド:

start():子プロセスインスタンスを開始します(子プロセスを作成)
is_alive():子プロセスがまだ存続しているかを判定します
join([timeout]):子プロセスの終了を待機するかどうか、または待機する秒数を指定します
terminate():タスクの完了にかかわらず、子プロセスを直ちに終了します
Process で作成したインスタンスオブジェクトの一般的なプロパティ:

name:現在のプロセスのエイリアス。デフォルトは Process-N(N は 1 から始まる整数)です
pid:現在のプロセスの pid(プロセス番号)です

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.