[英]How to use multithreading to download 1000+ .txt files in Python quickly
我有一個 .txt 文件,其中包含 1000 多個 .txt 文件的 URL 列表,我需要下載這些文件然后按字詞索引。 索引速度很快,但下載是一個巨大的瓶頸。 我嘗試使用 urllib2 和 urllib.request,但是使用這兩個庫中的任何一個下載單個文本文件需要 25-0.5 秒每個文件(平均這些文件大約是 600 個單詞/3000 個文本字符)
我意識到此時我需要使用多線程(作為一個概念),但我不知道在 Python 中我會如何做這件事。 在這一點上,我一次下載一個,它看起來像這樣:
with open ('urls.txt', 'r') as f: # urls.txt is the .txt file of urls, one on each line
for url in f:
response = urllib.request.urlopen(url)
data = response.read()
text = data.decode()
# .. and then index the text
這個項目提示允許我使用 select 任何語言。 我選擇了 Python 因為我認為它會更快。 我收到的樣本 output 列出的總索引時間約為 1.5 秒,所以我認為這大約是他們希望申請人達到的基准。 在我的機器(有 4 個內核)上,是否有可能在 Python 中為這么多可下載文件實現如此快速的運行時間?
編輯(包括有關索引的更多信息):
我下載的每個 .txt 文件都包含對大學的評論。 最終我想索引每條評論中的所有術語,這樣當你按術語搜索時,你會得到一個列表,其中列出了所有評論中包含該術語的大學,以及該術語在給定的評論中使用了多少次大學。 我有嵌套的字典,這樣另一個鍵是搜索詞,外部值是字典。 內部詞典的術語是一所大學的名稱,內部詞典的值是該術語在該大學的評論中出現的次數。
我不知道您在索引文本時到底在做什么,以及是否應該在線程之間交換數據,或者您是否正在寫入單個文件/變量(應該使用鎖),但這應該有效:
import threading
import urllib.request
with open('urls.txt', 'r') as f:
urls = f.read().splitlines()
def download_index(url, lock):
response = urllib.request.urlopen(url)
data = response.read()
text = data.decode()
#indexing
with lock:
#access shared resources
n = 2 #number of parallel connections
chunks = [urls[i * n:(i + 1) * n] for i in range((len(urls) + n - 1) // n )]
lock = threading.Lock()
for chunk in chunks:
threads = []
for url in chunk:
thread = threading.Thread(target=download_index, args=(url, lock,))
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
請注意,您應該考慮一次應該有多少連接,因為您很可能會因為同時發生 1000 多個請求而被阻止。 我不知道理想的數字,但玩弄n
數字,看看有什么用。 或者使用代理。
編輯:添加了一個鎖
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.