Pythonの分散プロセスとは何ですか? (分析例)

乌拉乌拉~
リリース: 2018-08-23 17:42:29
オリジナル
2495 人が閲覧しました

この記事では、Python 分散プロセスとは何かを見てみましょう。 Python 分散プロセスと、Python プログラミングで分散プロセスが果たせる役割について学びます。

スレッドとプロセスのうち、プロセスはより安定しており、複数のマシンに分散できるのに対し、スレッドは最大でも同じマシン上の複数の CPU にしか分散できないため、プロセスを優先する必要があります。

Python のマルチプロセッシング モジュールは複数のプロセスをサポートするだけでなく、マネージャ サブモジュールは複数のプロセスを複数のマシンに分散することもサポートします。サービス プロセスはスケジューラとして機能し、ネットワーク通信に依存してタスクを他の複数のプロセスに分散できます。マネージャー モジュールは適切にカプセル化されているため、ネットワーク通信の詳細を知らなくても、分散マルチプロセス プログラムを簡単に作成できます。

例: 同じマシン上で Queue を介して通信するマルチプロセス プログラムがすでに実行されている場合、タスクを処理するプロセスのワークロードが重いため、送信するプロセスを分離したいと考えます。タスクとそのタスクを処理するプロセス。2 台のマシンに分散されます。分散プロセスを使用して実装するにはどうすればよいですか?

元のキューは引き続き使用できますが、マネージャー モジュールを通じてネットワーク経由でキューを公開すると、他のマシン上のプロセスがキューにアクセスできるようになります。

まずサービス プロセスを見てみましょう。サービス プロセスは、キューを開始し、ネットワーク上でキューを登録し、キューにタスクを書き込む責任があります:

# task_master.py

import random, time, queue
from multiprocessing.managers import BaseManager
# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()
# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass
# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
    n = random.randint(0, 10000)
    print('Put task %d...' % n)
    task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
    r = result.get(timeout=10)
    print('Result: %s' % r)
# 关闭:
manager.shutdown()
ログイン後にコピー

マルチプロセス プログラムを作成する場合、作成されたキューは直接使用できますが、分散マルチプロセス環境では、タスクをキューに追加しても、元の task_queue を直接操作することはできません。 QueueManager を渡す必要があります。 manager.get_task_queue() で取得される Queue インターフェースが追加されます。

次に、別のマシンでタスク プロセスを開始します (このマシンでも開始できます):

# task_master.py
import random, time, queue
from multiprocessing.managers import BaseManager
# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()
# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass
# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
    n = random.randint(0, 10000)
    print('Put task %d...' % n)
    task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
    r = result.get(timeout=10)
    print('Result: %s' % r)
# 关闭:
manager.shutdown()
ログイン後にコピー

タスク プロセスはネットワーク経由でサービス プロセスに接続する必要があるため、IPサービスプロセスのを指定する必要があります。

ここで、分散プロセスの効果を試すことができます。まず、task_master.py サービス プロセスを開始します。

$ python3 task_master.py 
Put task 3411...
Put task 1605...
Put task 1398...
Put task 4729...
Put task 5300...
Put task 7471...
Put task 68...
Put task 4219...
Put task 339...
Put task 7866...
Try get results...
ログイン後にコピー

task_master.py プロセスがタスクを送信した後、結果キューの結果の待機を開始します。ここで、task_worker.py プロセスを開始します。

$ python3 task_worker.pyConnect to server 127.0.0.1...
run task 3411 * 3411...
run task 1605 * 1605...
run task 1398 * 1398...
run task 4729 * 4729...
run task 5300 * 5300...
run task 7471 * 7471...
run task 68 * 68...
run task 4219 * 4219...
run task 339 * 339...
run task 7866 * 7866...
worker exit.
ログイン後にコピー

task_worker.py プロセスが終了し、結果は引き続き task_master.py プロセスに出力されます。

Result: 3411 * 3411 = 11634921
Result: 1605 * 1605 = 2576025
Result: 1398 * 1398 = 1954404
Result: 4729 * 4729 = 22363441
Result: 5300 * 5300 = 28090000
Result: 7471 * 7471 = 55815841
Result: 68 * 68 = 4624
Result: 4219 * 4219 = 17799961
Result: 339 * 339 = 114921
Result: 7866 * 7866 = 61873956
ログイン後にコピー

この単純なコードは何に使用されますか?マスター/ワーカーモデル?実際、これはシンプルですが真の分散コンピューティングです。コードを少し変更して複数のワーカーを起動することで、タスクを数台または数十台のマシンに分散できます。たとえば、n*n を計算するコードは、メールキューの非同期送信を実現します。

ネットワーク経由で Queue にアクセスできるのは、QueueManager を介しているためです。 QueueManager は複数の Queue を管理するため、各 Queue のネットワーク呼び出しインターフェイスに get_task_queue などの名前を付ける必要があります。

authkey の用途は何ですか?これは、2 つのマシンが正常に通信し、他のマシンによる悪意のある干渉を受けないようにするためです。 task_worker.py の authkey が task_master.py の authkey と一致しない場合、接続は確実に失敗します。

Python の分散プロセス インターフェイスはシンプルで適切にカプセル化されているため、重いタスクを複数のマシンに分散する必要がある環境に適しています。

Queue の役割はタスクを配信し、結果を受け取ることであることに注意してください。各タスクを記述するデータの量はできるだけ少なくする必要があります。たとえば、ログ ファイルを処理するタスクを送信する場合、サイズが数百メガバイトのログ ファイル自体を送信するのではなく、ログ ファイルが保存されている完全なパスを送信すると、ワーカー プロセスはファイルを次の場所から読み取ります。共有ディスク。

以上がこの記事の内容です、この記事では主にpython分散プロセスの関連知識を紹介しますので、上記の内容を理解するために活用していただければ幸いです。この記事で説明したことがあなたのお役に立ち、Python の学習が容易になることを願っています。

関連知識の詳細については、php 中国語 Web サイトの Python チュートリアル 列を参照してください。

以上がPythonの分散プロセスとは何ですか? (分析例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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