python分布のプロセスを詳しく説明します。


ThreadとProcessでは、Processがより安定しています。また、Processは複数のマシンに分布していますが、Threadは最大で同じマシンの複数のCPUにしか分布していません。
Pythonのmultiprocessingモジュールは、マルチプロセスをサポートするだけでなく、ここでmanagersサブモジュールは、マルチプロセスを複数のマシンに分散することもサポートしている。一つのサービスプロセスは、スケジューラとして、他のプロセスにタスクを分散させ、ネットワークに依存して通信することができる。managersモジュールのパッケージが良いので、ネットワーク通信の詳細を知る必要がなく、分散型プロセスを簡単に作成することができます。
例を挙げます。Que通信を通じて処理するプロセスが同じマシンで実行されている場合、現在は処理タスクの処理が大変なので、任務を送るプロセスと処理のプロセスを二つのマシンに分散させたいです。分散プロセスでどうやって実現しますか?
既存のQueueは引き続き使用できますが、マンチェスターモジュールによってQueをネットに露出させることで、他のマシンのプロセスにQueを訪問することができます。
まずサービスのプロセスを見て、サービスのプロセスはQueを起動して、Queをネットに登録して、Queの中に任務を書きます。

# 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()
注意してください。一つのマシンにプロセスを書く時、作成したQueは直接に使ってもいいです。しかし、分散式の多プロセス環境の下で、Queに任務を追加します。直接に元のtask_に対してはいけません。queueで操作すると、Queue Managerのパッケージを迂回してしまいます。manager.get_を通過しなければなりません。task_Queインターフェースを取得しました。
その後、他のマシンでタスクプロセスを起動します。

# 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(u)を起動します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プロセスはタスクを送信した後、reultキューの結果を待ち始めます。今からtask(u)を開始しますウォーカー.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_ウォーカー.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
この簡単なマスター/Workerモデルは何のために使いますか?これは簡単ですが、本当の分散式計算です。コードを少し改造して、複数のワーカーを起動すれば、数台または数十台のマシンにジョブを分布させます。例えば、n*nを計算するコードをメールに変えて、メールキューの非同期送信を実現します。
Queueueがインターネットを通じてアクセスできるのは、Queueue Managerを通じて実現されたからです。Queueueue Managerが管理しているのは一つのQueueだけではないので、Queごとにインターネットの呼び出しポートに名前をつけます。例えば、get_task_queue
authkeyは何に使いますか?これは2台のマシンが正常に通信し、他のマシンに悪意のある干渉を受けないようにするためです。task_ならウォーカー.pyのauthkeyとtask_master.pyのauthkeyは違っていますので、必ず接続できません。
Pythonの分散プロセスインターフェースは簡単で、パッケージは良好で、重いタスクを複数のマシンに分布させる環境に適しています。
Queueの役割は、タスクの伝達と結果の受信であり、各タスクの記述データ量はできるだけ小さくする必要があります。例えばログファイルを処理するジョブを送信すると、数百兆のログファイル自体を送信せずに、ログファイルを保存する完全なパスを送信し、Workerプロセスによって共有されたディスク上でファイルを読み込む。
以上はこの文章で述べたすべての内容です。この文章は主にpython分散プロセスに関する知識を紹介しています。資料を使って上記の内容を理解してほしいです。この文章で述べた内容があなたの役に立って、pythonの勉強がもっと楽になりますように。