この記事では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 メモリ管理について話す [非専門家]

推薦する

テンセントは情報通信技術アカデミーのOSCARでオープンソースのトップ事例の一つに選ばれ、そのオープンソースの実践が再び全国レベルで認められた。

10月16日、中国情報通信研究院が主催し、クラウドコンピューティング標準およびオープンソース推進委員...

タオバオ、ショッピングガイドウェブサイトの禁止を強化:アカウントログイン機能を廃止

淘宝網が美麗碼と莫谷街へのログイン機能を廃止した後、この2つのソーシャル電子商取引プラットフォームは...

ウェブサイトの内部SEO最適化を適切に行う:適切な収集、並べ替え、表示

みなさんこんにちは。私はMuzi Chengzhouです。ウェブサイトの SEO 作業に関して言えば...

境界ネットワーク セキュリティの再定義: ハイブリッドが未来

情報がクラウドにさらに流入するにつれて、境界セキュリティの役割は変化し、ネットワーク セキュリティの...

オンライン旅行サイトの診断:Qunar.comは期待外れ、Ctripも隠れた危険に直面している

Qunar.comのCEOである荘晨超氏は、2013年の財務報告書を発表した後、メディアのインタビュ...

サンノゼにある raksmart の 100M 帯域幅専用サーバーの簡単なレビューです。raksmart がデータを通じてどのように機能するかを説明します。

Raksmartは、米国サンノゼに本社を置く歴史ある企業です。コンピュータルーム、設備、ネットワーク...

推奨: lfchosting-$6.5/月/Xen/4 コア/1g メモリ/15SSD/1T トラフィック

4年後、lfchostingはついにトレンドに従い、新しいSSDハードドライブVPSを導入し、いくつ...

crissic - KVM VPS 60% オフ/openv ダブルリソース

Crissic の VPS は G ポートをベースとしており、月間トラフィックを使い切ると自動的に ...

ウェブページの信号対雑音比と SEO 最適化

ウェブマスターの友人は皆、SEO 最適化について知っているかもしれませんが、ウェブページの信号対雑音...

映画ネットワーク運用の基礎

映画ウェブサイトは簡単にお金を稼ぎ、構築できるため、多くのウェブマスターが映画ウェブサイトを開設する...

何? VMwareには現在、vSphereの2つのバージョンがあります

VMware は仮想化管理者に vSphere の別のバージョンである vSphere 6.7 を提...

Kubectl-iceプラグインは、クラスタコンテナの構成情報をより強力に表示します。

この号では、POD で実行中のコンテナの構成情報をすばやく表示できる実用的な Kubectl プラグ...

ウェブサイトのデザイン分析: デザインのロジックに関する簡単な説明

論理は、古典ギリシャ語の λόγος (logos) に由来し、もともと「言葉」または「スピーチ」を...

Dockerってすごいですよね? K8s を使用する理由

[[360669]]この記事はWeChatの公開アカウント「笑い好きの建築家」から転載したもので、著...

飢餓マーケティングはユーザーエクスペリエンスの向上に役立ちますか?

空腹は人間の本能です。多くの場合、このような状況では、人々はおいしさに惹かれ、他の要素を無視する傾向...