この記事ではPythonの分散プロセスインターフェースを紹介します

この記事ではPythonの分散プロセスインターフェースを紹介します

[[399138]]

1. はじめに

スレッドとプロセスの間では、プロセスの方が安定しており、複数のマシンに分散できるため、プロセスの方が優先されます。一方、スレッドは、最大で同じマシン上の複数の CPU にしか分散できません。

Python の multiprocessing モジュールは複数のプロセスをサポートするだけでなく、そのマネージャー サブモジュールは複数のプロセスを複数のマシンに分散することもサポートします。サービス プロセスをスケジューラとして記述し、タスクを複数の他のプロセスに分散し、ネットワーク通信を通じて管理することができます。

2. 事例分析

クローラー プログラムを実行すると、Web サイトのすべての画像がキャプチャされます。複数のプロセスが使用される場合、通常、1 つのプロセスが画像のリンク アドレスをキャプチャしてキューにリンク アドレスを配置する役割を担い、別のプロセスがキューからリンク アドレスを取得してダウンロードし、ローカルに保存する役割を担います。

分散プロセスでそれを実装するにはどうすればよいでしょうか?

一方のマシン上のプロセスはリンク アドレスを取得する役割を担い、もう一方のマシン上のプロセスはそれを保存する役割を担います。主な問題は、他のマシン プロセスがアクセスできるようにキューをネットワークに公開することです。分散プロセスはこのプロセスをカプセル化します。これは、ローカル キューのネットワーク化と呼ぶことができます。

例:

1.py

  1. multiprocessing.managersからBaseManager をインポートします
  2. マルチプロセッシングからfreeze_supportをインポートし、キュー
  3. # タスク数
  4. タスク番号 = 10
  5.  
  6. # 送信キューと受信キュー
  7. task_queue = キュー(タスク番号)
  8. result_queue = キュー(タスク番号)
  9.  
  10. get_task() を定義します:
  11. task_queueを返す
  12.  
  13. get_result() を定義します:
  14. 結果キューを返す
  15. # 同様のキューマネージャを作成する
  16. クラス QueueManager(BaseManager):
  17. 合格
  18.  
  19. win_run() を定義します:
  20. # ネットワークに登録され、Queue オブジェクトに関連付けられた呼び出し可能オブジェクト
  21. # キューオブジェクトをネットワーク上に公開する
  22. # ウィンドウ下のバインディング呼び出しインターフェースはラムダを直接使用できないため、最初に関数を定義してからバインドすることしかできません。
  23. QueueManager.register( 'get_task_queue' 、呼び出し可能=get_task)
  24. QueueManager.register( 'get_result_queue' 、呼び出し可能=get_result)
  25. # ポートをバインドし、認証パスワードを設定する
  26. マネージャー = QueueManager(アドレス = ( '127.0.0.1' , 8001), authkey = 'qiye' .encode())
  27. # 管理を開始し、情報チャネルを監視する
  28. マネージャー.開始()
  29.  
  30. 試す:
  31. # ネットワーク経由でタスクキューと結果キューを取得する
  32. タスク = manager.get_task_queue()
  33. 結果 = manager.get_result_queue()
  34.  
  35. # タスクを追加
  36. url[ "ImageUrl_" + str(i)の範囲内iが範囲 (10)]の範囲の場合:
  37. print( 'urlは%sです' % url)
  38. タスク.put(URL)
  39.              
  40. print( '結果を取得してみてください' )
  41. iが範囲(10)内にある場合:
  42. print( '結果は%sです' % result.get(timeout=10))
  43.  
  44. を除外する
  45. print( 'マネージャーエラー' )
  46. ついに:
  47. マネージャー.シャットダウン()
  48.  
  49. __name__ == '__main__'の場合:
  50. フリーズサポート()
  51. win_run()

サーバーに接続し、ポートと認証パスワードがサーバー プロセスのものとまったく同じであることを確認します。ネットワークからキューを取得し、ローカライズし、タスク キューからタスクを取得して、結果を結果キューに書き込みます。

2.py

  1. #コーディング:utf-8
  2. インポート時間 
  3. multiprocessing.managersからBaseManager をインポートします
  4. # 同様のマネージャーを作成します:
  5. クラス Manager(BaseManager):
  6. 合格
  7. #QueueManagerを使用してQueueのメソッド名を登録および取得する
  8. マネージャー.register( 'get_task_queue' )
  9. Manager.register( 'get_result_queue' )を登録します。
  10. #サーバーに接続します:
  11. サーバーアドレス = '127.0.0.1'  
  12. print( 'サーバー%sに接続...' % server_addr)
  13. # ポートと認証パスワードがサービス プロセスで設定されたものとまったく同じであることを確認します。
  14. m = マネージャー(アドレス=(server_addr, 8001), authkey= 'qiye' )
  15. # ネットワークから接続:
  16. m.connect () 関数
  17. #キューオブジェクトを取得します:
  18. タスク = m.get_task_queue()
  19. 結果 = m.get_result_queue()
  20. #タスク キューからタスクを取得し、結果を結果キューに書き込みます。
  21. while(task.empty()ではない):
  22. image_url = task.get( True 、タイムアウト = 5)
  23. print( 'タスクを実行 %s をダウンロード...' % image_url)
  24. 時間.sleep(1)
  25. result.put( '%s--->成功' %image_url)
  26. #仕上げる:
  27. print( 'ワーカー終了。' )

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

結果は次のとおりです。

画像のアドレスを取得し、2.py に渡します。

1.py で渡されたアドレスを受け取り、画像をダウンロードすると、コンソールにクロール結果が表示されます。

結論

この記事は Python に基づいています。 Python の分散プロセス インターフェースはシンプルで適切にカプセル化されており、負荷の高いタスクを複数のマシンに分散する必要がある環境に適しています。キューの役割はタスクを転送し、結果を受け取ることであると説明します。

皆さんも積極的に挑戦してみてください。他の人がやっているのを見ると簡単に実装できることもありますが、自分で実装しようとすると、さまざまな問題が必ず発生します。あまり野心的になりすぎず、熱心に取り組んで、より深く理解できるようにしてください。

<<:  Daoentropy 分散ストレージが PACS ストレージとしてより適している理由は何ですか?

>>:  JVM メモリ管理について話す [非専門家]

推薦する

感謝祭/ブラックフライデー/サイバーマンデースペシャル

親愛なるみんな、ホスティング業界で一年で最も待ち望まれている日がやってきました。海外のホスティングベ...

Cloudcone - 安価な KVM/ロサンゼルス/$2.78/メモリ 2g/ハードディスク 10g/トラフィック 3T

Quadcone 傘下の Cloudcone ブランドはごく最近設立されましたが、低価格、高度な構成...

モバイルソフトウェア開発者向けのシステム選択

「携帯電話」という言葉は、食べること、飲むこと、遊ぶことと同じように、人々の生活に欠かせない要素とな...

hiformance-$7/KVM/6G メモリ/6 コア/20gSSD/4T トラフィック/3IPv4/ロサンゼルス/Windows

米国のホスティング業界の新参者である hiformance.com は現在、ダラス、オグデン (ユタ...

LocVPS: 香港 VPS (将軍澳大帯域幅)、ドイツ CN2 VPS、30% オフ プロモーション、中国語 Windows 付き

locvpsも中国ではお馴染みのブランドです。基本的にはMine General Teamが運営して...

中小規模のウェブマスターは「ユーザーエクスペリエンス」という4つの単語を深く理解する必要がある

中小規模のウェブマスターと一部の成熟した IT 実践者の違いは何かと言えば、それは「ユーザー エクス...

SEO とユーザー エクスペリエンスのどちらがより重要ですか?

SEOキーワードランキングとユーザーエクスペリエンスのどちらが重要でしょうか?この記事はウェブサイト...

SEOを学んでいる初心者はフォーラムには近づかないでください

私は長年 SEO に取り組んでおり、さまざまな規模の SEO フォーラムやウェブマスター フォーラム...

ウェブサイトの障壁を排除して、検索スパイダーがより速くクロールできるようにします

ウェブサイトがBaiduスパイダーの支持を得られるかどうかは、ウェブサイトのコンテンツの質の高さだけ...

AWS IoT Device Defender について

AWS IoT Device Defender は、IoT デバイスのセキュリティ保護に役立つフルマ...

ウェブサイト検索エンジン最適化プログラムの分析例

1. 最適化ガイダンス私たちは、留学生のニーズとウェブサイトのユーザーエクスペリエンスを指針として、...

新浪幹部は微博事業の調整を認め、アリババの戦略的投資を否定

テンセントテクノロジーの雷建平は11月22日に報告した。新浪微博が世論の渦に巻き込まれた。新浪微博は...