私は、要求する必要がある100,000のURLを持つファイルを持っています。処理は要求と比較して無視できないほどの時間を要するので、単にマルチスレッドを使用すると、私に部分的なスピードアップを与えるだけです。私が読んだことから、multiprocessing
モジュールなどを使用すると、複数のコアを使用できるため、より大幅なスピードアップが可能になると思います。私は複数のスレッドを持つ複数のプロセスを使用したいと思っていますが、どうやってそれを行うのかは分かりません。ここでPythonで100,000のURLを読み込んで処理する最速の方法
は(What is the fastest way to send 100,000 HTTP requests in Python?に基づく)のスレッドを使用して、私の現在のコードです:
from threading import Thread
from Queue import Queue
import requests
from bs4 import BeautifulSoup
import sys
concurrent = 100
def worker():
while True:
url = q.get()
html = get_html(url)
process_html(html)
q.task_done()
def get_html(url):
try:
html = requests.get(url, timeout=5, headers={'Connection':'close'}).text
return html
except:
print "error", url
return None
def process_html(html):
if html == None:
return
soup = BeautifulSoup(html)
text = soup.get_text()
# do some more processing
# write the text to a file
q = Queue(concurrent * 2)
for i in range(concurrent):
t = Thread(target=worker)
t.daemon = True
t.start()
try:
for url in open('text.txt'):
q.put(url.strip())
q.join()
except KeyboardInterrupt:
sys.exit(1)
。@ Gusでは、同時に100を使用してスピードアップすることはありません。それらはすべて同時に出ていて、驚いています。すべてOSプロセスを待って戻ってきます。あなたができることは、2つのステップです。スレッド化(i/o)ですべてを引き出し、コア* 2を使用してマルチプロセスを実行します。 (または、同じ問題があります) – Merlin
私は参照してください。多分、私は2つのスクリプトに分割することができます.1つのスクリプトでマルチスレッドのみを使用し、生のHTMLをファイルに保存することができます。その後、ファイルを処理した後にファイルを削除して、マルチプロセッシングを行う別のファイルを作成します。これが最善の解決策であるかどうかは分かりませんか? – Gus
それは私がやることです。 - そして、やります。 ---そうでなければ、言語を切り替えることができ、ノードjをスクレイプすることができますが、それは全く別のプロセスです。 – Merlin