1. はじめに
スレッドとプロセスの中で、プロセスがより安定しており、複数のマシンに分散できるため、プロセスを優先する必要があります。最大でも同じマシン上の複数の CPU に分散できます。
Python のマルチプロセッシング モジュールは複数のプロセスをサポートするだけでなく、マネージャ サブモジュールは複数のプロセスを複数のマシンに分散することもサポートします。サービス プロセスをスケジューラとして作成して、タスクを他の複数のプロセスに分散し、管理をネットワーク通信に依存することができます。
2. 事例分析
クローラー プログラムを実行する場合、Web サイトのすべての画像をクロールします。複数のプロセスを使用する場合、通常は 1 つです。プロセスは画像のリンク アドレスを取得してキューに入れる役割を果たし、別のプロセスはキューからリンク アドレスを取得してダウンロードしてローカルに保存する役割を担います。
分散プロセスを使用するにはどうすればよいですか?
あるマシン上のプロセスはリンク アドレスを取得する責任を負い、他のマシン上のプロセスはリンク アドレスを保存する責任を負います。遭遇する主な問題は、他のマシン プロセスがキューにアクセスできるようにキューをネットワークに公開することです。分散プロセスはこのプロセスをカプセル化します。このプロセスはローカル キューのネットワーク化と呼ぶことができます。
例:
1.py
from multiprocessing.managers import BaseManager from multiprocessing import freeze_support, Queue # 任务个数 task_number = 10 # 收发队列 task_quue = Queue(task_number) result_queue = Queue(task_number) def get_task(): return task_quue def get_result(): return result_queue # 创建类似的queueManager class QueueManager(BaseManager): pass def win_run(): # 注册在网络上,callable 关联了Queue 对象 # 将Queue对象在网络中暴露 # window下绑定调用接口不能直接使用lambda,所以只能先定义函数再绑定 QueueManager.register('get_task_queue', callable=get_task) QueueManager.register('get_result_queue', callable=get_result) # 绑定端口和设置验证口令 manager = QueueManager(address=('127.0.0.1', 8001), authkey='qiye'.encode()) # 启动管理,监听信息通道 manager.start() try: # 通过网络获取任务队列和结果队列 task = manager.get_task_queue() result = manager.get_result_queue() # 添加任务 for url in ["ImageUrl_" + str(i) for i in range(10)]: print('url is %s' % url) task.put(url) print('try get result') for i in range(10): print('result is %s' % result.get(timeout=10)) except: print('Manager error') finally: manager.shutdown() if __name__ == '__main__': freeze_support() win_run()
サーバーに接続します。ポートと検証パスワードはサーバーのものとまったく同じにしてください。ネットワークからキューを取得するプロセス。ローカリゼーションを実行し、タスク キューからタスクを取得し、結果を結果キューに書き込みます
2.py
#coding:utf-8 import time from multiprocessing.managers import BaseManager # 创建类似的Manager: class Manager(BaseManager): pass #使用QueueManager注册获取Queue的方法名称 Manager.register('get_task_queue') Manager.register('get_result_queue') #连接到服务器: server_addr = '127.0.0.1' print('Connect to server %s...' % server_addr) # 端口和验证口令注意保持与服务进程设置的完全一致: m = Manager(address=(server_addr, 8001), authkey='qiye') # 从网络连接: m.connect() #获取Queue的对象: task = m.get_task_queue() result = m.get_result_queue() #从task队列取任务,并把结果写入result队列: while(not task.empty()): image_url = task.get(True,timeout=5) print('run task download %s...' % image_url) time.sleep(1) result.put('%s--->success'%image_url) #结束: print('worker exit.')
タスクプロセスはネットワーク経由でサービスプロセスに接続する必要があるため、サービスプロセスのIPを指定します。
実行結果は次のとおりです。
画像のアドレスを取得し、そのアドレスを 2.py に渡します。
1.py によって渡されたアドレスを受信し、イメージをダウンロードすると、コンソールにクロール結果が表示されます。
#3. 概要
この記事は Python の基礎、Python の分散プロセス インターフェイスに基づいています。シンプルでカプセル化されているので、重いタスクを複数のマシンに分散する必要がある環境に適しています。 Queue の役割はタスクを配信し、結果を受け取ることであると説明します。以上がPython の分散プロセス インターフェイスを理解するのに役立つ記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。