爬虫類でのPythonのマルチスレッドアプリケーション

碑文:テストエンジニアは、多くの場合、テスト・データ・ソースの問題解決策は何もなく、三つの方法解決する必要があるとして:(3)から(2)のデータをコピーし、実際の運用環境に直接インターネットからデータをフェッチするために(1)登山をするスクリプトまたはツールを使用して、独自のデータを構築。いくつかの時間前、より多くのテストデータを取得するために、著者は基本的な機能は、プロジェクトのニーズを満たすためにも、インターネットからデータを取得クロールクローラーを作ったが、効率をクロールすることはあまり高くありません。より良いテストエンジニアとして、爬虫類の効率を向上させるためには、爬虫類の分野では、マルチスレッドアプリケーションで探すことにしました。

まず、なぜマルチスレッド化の必要性
  
  すべてが、なぜこれらのノウハウを知っている必要があります。関連する知識のマルチスレッド理解する前に、我々はあなたがマルチスレッドを必要とする理由を見てみましょう。それは、あなたが、移動する単一のスレッドが発動機に似ているようにしたいアナロジーは、彼は、想像することができ、作業効率が非常に遅い運用一連の処理を降ろし、運転、ハンドリング、梱包担当の男でした。マルチスレッドと同等の4回の引っ越し、車に運ばれてきたために完全なパッケージを招待し、その後、アンロードに丁によって最終的には先のプロピオン酸に行きました、と。
  このマルチスレッドの利点は効率的であり、資源をフルに活用することができ、欠点は、さまざまなスレッド間で調整されるべきであることを示している、または容易な混乱に(少年が少年であるように、2人の少年のハーフの男の子、3人の男の子がない少年ジレンマ)。複数のスレッドを使用するときため、爬虫類の効率を改善するために、我々は、マルチスレッドの問題の管理に特別な注意を払います。

基本第二には、マルチスレッド
  
  プロセス:三つの部分のプログラム、データ収集、プロセス制御ブロックすることで、データセット上で動作するプログラムのプロセスです。あなたは、2つのプロセスをオープンしたプログラムとデータセットに二回実行した場合。プロセスは、リソース管理の基本単位です。オペレーティング・システムでは、各プロセスは、アドレス空間を持っていますが、デフォルトの制御プロセスがあります。

  スレッド:それはCPUのスケジューリングとディスパッチの基本単位だけでなく、実行の最小単位である、物理的なプロセスです。コンテキストスイッチの消費量を削減するために表示され、システムの並行性を向上させ、かつ欠陥を克服するためのプロセスは、一つのことを行うことができます。スレッドがプロセスによって管理され、複数のスレッドは、親プロセスのスペースのリソースを共有しています。

  プロセスとスレッドの関係は:
  1つのスレッドだけで一つのプロセスに属することができ、プロセスは複数のスレッドを持つことができますが、少なくとも一つのスレッドがあります。
  プロセスに割り当てられたリソース、プロセスのすべてのリソースを共有するのと同じプロセス内のすべてのスレッド。
  実際にCPU上で実行スレッドにCPUのポイントはスレッドです。

  スレッド作業:
  示されるように、スレッドがCPU上で実行シリアルを指し、スレッドのCPUを複数に並走する複数の、「擬似並列」によって複雑に、同時に、一つだけCPUタスク、CPUのタイムスライスを実行し、1つのスレッドのみによるもの、それはすべてのスレッドが「同時」であるユーザーに表示される非常に短い時間スライスに非常に短いタイムスライス、順番に各スレッドを、取ります。同時は、複数のスレッドを実行するための単一のCPUで最も実用的な方法です。

  プロセスの作業状況:
  ランニング、ブロッキング、準備ができて:プロセスは3つの状態があります。以下のように三つの状態間の変換:スケジューラは他の受動的プロセスを選択することができるので、アクティブブロッキング状態に起因し得る入力を待って実行可能なプロセスは、典型的には、CPU時間にそれに割り当てられた準備完了状態に(入ります);レディ状態に有効な入力までによるプロセスを阻止し、プロセスの準備状態をスケジューラが動作中に何度も何度もそれを選んだからです。

  
第三に、マルチスレッド通信例

  または爬虫類の問題までのリターンは、我々は、クロールのブログ記事は、最初のリストのページをクロールされ、その後、記事に合わせてコンテンツをクロールクロールてくる結果一覧ページの詳細を知っているとき。高速かつクロール速度は、より良いリストページのストーリーページのクロール速度よりも確かです。
  この場合、我々はクロールページ、スレッドB、スレッドCを担当して記事のスレッドAリストを設計することができ、Dスレッドは記事の詳細をクロールする責任があります。このような構造からの結果を取るために、グローバル変数に類似した構造で、結果のURLのリスト、スレッドB、C、D。
  - ; quequeモジュール-グローバル変数に類似した構造を維持する責任がオープンスレッド、および他の操作を作成するための責任スレッドモジュール:Pythonで、二つの支持マルチスレッドのモジュールがあります。おそらく、学生がそれ何のできないグローバル変数を直接使用することを要求されます:ここで私はそれを追加したいですか?なぜ地球上のキューを使うのか?、URLのみで、グローバル変数のスレッドB判定がまだスレッドCへのURL、CPUタイムスライスを削除する前に、空でないように(リストタイプ)のグローバル変数として、グローバル変数はスレッドセーフではありませんので、 Cのスレッドが削除URL続く、その後、CPUタイムスライスBのターンになる、Bは空のリストとエラーでデータので取られます。キューモジュールを実装したマルチプロデューサー、マルチコンシューマ・キュー、プット値の値は、スレッドセーフであるとき。

  直接参照するには皆のためのコードで騒ぎ、:

インポートスレッド#の輸入threadingモジュール
からのキューのインポートキュー#のインポートキューモジュール
のインポート#のインポート時のモジュール

クロール詳細ページの記事の
DEFの:get_detail_html(detail_url_list、言及したID上記)
     しばらく真:
        URL = detail_url_list.get() GETメソッドキューキュー抽出するためのキュー要素から 
        time.sleepを(2)  遅延2S、シミュレーションおよびプロセスのネットワーク要求の記事クロールの詳細
        印刷:GETのURL} {詳細が終了スレッド{ID}  .format(ID = ID、 URL = URL)) 印刷スレッドIDと記事のURLのコンテンツをクロールして

クロール記事リストを
デフget_detail_url(キュー):
      I におけるレンジ(10000 ):
        time.sleep( 1) 遅延1S、より速くクロールシミュレート記事の詳細 
        queue.put(" http://testedu.com/{id} "。フォーマット(ID = I)) キューにキューを配置するための方法を置くキューキュー要素、FIFOキューからキュー、それが最初のURLでも出ることでしょう置きます。
        印刷" GET URL {ID}エンドの詳細" .format(ID = I)) URLをされている記事プリントアウトを

主な機能
のIF  __name__ == " __main__ " 
    detail_url_queue =キュー(MAXSIZE = 1000) 千スレッドセーフなFIFOキューのサイズとキュー構造
    4つのスレッドを作成する 
    スレッド= threading.Thread(対象= get_detail_url、引数=(detail_url_queue、)) AスレッドがクロールURLのリストを担当して 
    html_thread = []
     以下のために範囲(3 ):
        スレッド2 = threading.Thread(対象= get_detail_html、引数= (detail_url_queue、i))を
        html_thread.append(スレッド2) BCDスレッドクロール記事は詳細 
    のstart_time = time.time()
    4を開始しますスレッド
    Thread.start()の
     ための I レンジ(3 ):
        html_thread [I] .start() 
    ()子スレッドに代わって機能が完了する前に、親プロセスがブロックされている状態thread.join、全てのスレッドの終了を待ちます。
    Thread.join()
     のために I (3レンジ):
        html_thread [I] .join()

    印刷" :{S}最後の時間" - START_TIME).format(time.time()) ABCD 4スレッドのような合計時間をクロールする主なプロセスを計算した後。

 

  結果:


  追伸:秩序演算結果は、スレッド間で動作するように見ることができるから、任意のエラーや警告の状況が表示されません。目に見えるグローバル変数を直接使用するよりもはるかに安全であると、複数のスレッド間の通信のためにキューキューを使用しました。そして、複数のスレッドを使用していないよりもマルチスレッドの使用は、その後、クロールは、テストデータをクロールする過程で非常に実用的であると言うことができるアカウントにセキュリティスレッドを服用しながら、爬虫類の効率を向上させ、はるかに少ない時間を持っています道。小さなパートナーがああに望むことができるGET!

転送します。https://mp.weixin.qq.com/s/LsRNxAVJywKwEXxo8WuwLw

おすすめ

転載: www.cnblogs.com/songzhenhua/p/11824483.html