1.コミュニケーションのスレッド - 共有変数
欠点は、私たちが望むものを達成するために、共有変数をロックする必要があります
。1 #!/ユーザー/ binに/ PythonのENV 2 #- * -コーディング:UTF-8 - * - 。3 。4 #IO操作のため、パフォーマンスのマルチプロセスとマルチスレッドはほとんど差 5 #Threadクラスの一例として1 6 インポート時間 7 インポートスレッディング 8。 detail_url_list = [] 9。 10 11。 DEFのget_detail_html(detail_url_list): 12である 。#の使用共有変数 さ13 #グローバルdetail_url_list 14 ながらTRUE: 15 IF でlen(detail_url_list): 16 URL =detail_url_list.pop() 。17 #記事の詳細ページをクロール 18が 印刷(' 詳細HTMLを始める' ) 。19 time.sleep(2 ) 20は、 印刷(' GET HTMLエンドの詳細' ) 21で 22で 23れる DEF (detail_url_list)をget_detail_url: 24 しばらく真: 25個の #使用共用変数 26 #は、株式会社フリーはdetail_url_list参加 27件の #クロール記事一覧ページ 28 印刷(「URL詳細を始めます」) 29 time.sleep(2 ) 30 のための I における範囲(20 ): 31 detail_url_list.append(' http://projectsedu.com/{id} ' .format(ID = i)は) 32 プリント(「詳細URLの末尾を取得します' ) 33 34 35 #1线程通信方式-共享变量 36 なら __name__ == ' __main__ ' : 37 START_TIME = time.time() 38 thread_detail_url = threading.Thread(目標= get_detail_url、引数=(detail_url_list)) 39 thread_detail_url.start() 40 のための I における範囲(10 ): 41 thread_detail_html = threading.Thread(目標= get_detail_html、引数= (detail_url_list)) 42 thread_detail_html.start() 43 44 プリント(「最後時間:{} ' .format(time.time() - START_TIME))
PS:実行しようとしないでください、私は、whileループを設定しますが、デーモンスレッドを設定しないでください。。。
キューを介してスレッド間2.通信
。1 #!/ユーザー/ binに/ PythonのENV 2 #- * -コーディング:UTF-8 - * - 3。 4。 #キューを介して、スレッド間2.通信 5。 からのキューのインポートキュー 6。 インポート時間 7。 インポートスレッディング 8。 detail_url_list = [] 。9 10 11 DEF (キュー)get_detail_html: 12であり、 一方、真: 13である #1 キューがメソッドを取得するキューが空の場合、ブロッキング、すなわち、ブロッキング機能で 14 URLを= queue.get() 15 #クロール記事詳細ページ 16 印刷(' 詳細HTMLを始める' ) 。17 (2 time.sleepを) 18が 印刷(' GET HTMLエンドの詳細' ) 19。 20で 21れる DEF )(キューをget_detail_url: 22です しばらく真: 23です #クロールの記事一覧ページ 24 印刷(「詳細をGET URL開始" ) 25 time.sleep(2 ) 26がある ために私にレンジ(20 :) 27 #を内部のデータキューを挿入するために 28 #ブロッキング機能は、キューがいっぱいになったとき、置かれているブロックします 29 queue.put(' http://projectsedu.com/{id} ' .format(ID = I)) 30 印刷(' GET URLエンドの詳細を' ) 31は、 32 33である #1通信スレッド-変数共有 34で IF __name__ == ' __main__ ' : 35 #は、好ましくは最大、またはあまりにも多く、衝撃バックメモリに設けられた 36 detail_url_queue =キュー(MAXSIZE = 1000 ) 37 [ START_TIMEは= (time.time)が 38である threading.Thread =(目標= get_detail_url、引数=のthread_detail_url(detail_url_queue)) 39 thread_detail_url.start() 40 のための I における範囲(10 ): 41 thread_detail_html = threading.Thread(目標= get_detail_html、引数= (detail_url_queue)) 42 thread_detail_html.start() 43 44 プリント(「最後時間:{} ' .format(time.time() - START_TIME))