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

推薦する

購入したトラフィックを価値あるものにするために、APPプロモーションチャネルの効果を5段階で最適化します。

プロモーション期間中にトラフィックを有効活用し、ユーザーが購入したトラフィックの価値を最大化するには...

DRaaS プロバイダーを変更する必要がある 8 つの兆候

クラウド災害復旧市場は成長しており、各ベンダーが異なるレベルのサービスとサポートを提供しています。サ...

成功するSEO担当者が持つべきスキル

今や SEO は特別な秘密でも、神秘的なものでもありません。SEO チュートリアルはどこにでもありま...

漏洩したパスワード照会サイトが一夜にして人気に:冗談でトラフィックが急増

漏洩したパスワード検索サイトへのアクセスが一夜にして急増パスワードが漏洩した場合、QQアカウントのロ...

21Vianet がクラウド コンピューティング開発プラットフォームを発表

4月2日の午後、クラウドコンピューティングは間違いなく現在のインターネット業界でホットな話題と見なさ...

莱旺のユーザー数は1日で524万人急増し、ジャック・マー氏は3日以内にWeChatを停止すると発表した。

アリババが社内で明らかにしたデータによると、同社が宣伝しているモバイルIMアプリケーション「莱旺」は...

アリペイは30社の電子商取引企業が参加する初のマーチャントセキュリティアライアンスを設立した。

テンセントテクノロジーニュース(朱旭東)は9月17日、アリペイが本日、中国初のインターネット商店セキ...

ロングテールで勝つことはSEO担当者にとって数少ない良い方法の1つです

昨日、私はSotu.comサロンに出席し、王同教授の見解を聞きました。彼が挙げた例の一つは、百度で趙...

オンラインショッピング、グループ購入、ショッピングガイドから始まるクローズドビジネスループの価値と課題

多くの人が「クローズドループは誤った命題だ」と話すとき、多くの本当の業界関係者は「ははは」と反応する...

2020 年の中国のインターネットに関する 10 大予測

2018年に中国のインターネットはどこに向かうのでしょうか?明らかに、今年はインターネット業界全体に...

WordPress 用のパーソナライズされたユーザーフレンドリーな 404 ページを作成する方法

ウェブマスターとして、私も間違いを犯すでしょうし、あなたも間違いを犯すでしょうし、私たちは皆間違いを...

金融攻撃:NetEase Cloudの専用クラウドがFucong Financialのビジネスシナリオの革新を支援

インターネット時代の後半に入り、多くの業界関係者は周鴻一に対する懐かしさをますます表明し、「エコ反撃...

Weiboマーケティング手法をよく使っている皆さんは、本当に知っていますか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeChatが使われるよ...

コンテナを実行するのにDockerイメージは実際には必要ない

これは少し見出しっぽいですが、コンテナ イメージは単なる組織の rootfs であるというのは本当で...

手頃な価格で高速、実名/登録不要の香港クラウドサーバーのおすすめ

この記事の目的は、香港のクラウド サーバーを推奨することです。香港のクラウド サーバーの利点は、速度...