[英]Optimization in Multithreading in Python to download files
我是python的新手。 當前,我正在嘗試實現一個程序以從遠程服務器(http / https)下載大量文件。 沒有 的文件很大(> 1000)。 為了解決這個問題,我需要以某種方式實現代碼,以便它可以以有效和最佳的方式利用OS資源。 我采用的方法是多處理。
這是我的實現:
import urllib,urlparse
import urllib2
import os
import multiprocessing
from multiprocessing.dummy import Pool as ThreadPool
from itertools import repeat
def download_file((url, d_dir)) :
#logger.debug('Download URL -> ' + url)
try :
with open(d_dir + os.sep + urlparse.urlparse(url).path, 'wb') as tfile :
tfile.write(urllib2.urlopen(url).read())
except :
logger.error('There was a some problem while downloading file, ' + url)
def create_pool(d_links, d_dir) :
pool = multiprocessing.Pool(processes=10)
pool.map(download_file, zip(d_links, repeat(d_dir)))
def extract_urls() :
# some logic to extract urls from files
links = {‘url1’, ‘url2’, ‘url3’, ‘url4’, ‘url5’, …}
#created process pool
create_pool(links, l_dir)
如果我運行此代碼,它將為我提供正常的輸出。 但是我認為我沒有正確實現多處理。 您能否提供一些輸入信息來優化這段代碼?
提前致謝。
問候,Ashish
你可以這樣做
import multiprocessing as mp
with mp.Pool(4) as pool:
pool.map_async(download_file, zip(d_links, repeat(d_dir)))
參考: https : //docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool
請注意, map_async並行執行該工作,但是map阻塞了該過程,直到被調用函數返回
我在python 2.7中有同樣的問題。 問題在於, multiprocessing
庫在pool.map(func,arg)
不支持多個參數。 作為解決方案,我使用了pathos
的多處理庫。 所以你的功能可能如下
from pathos.multiprocessing import ProcessingPool as Pool
from itertools import izip
p = Pool(self.nbr_processes)
try:
p.map(download_file, izip(d_links, repeat(d_dir)))
p.close()
p.join()
except Exception as f:
logging.error(f)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.