標準ライブラリにこのようなものがあったと確信していましたが、間違っていたようです。
urlopen
並行したいURLがたくさんあります。map
作業が一連のスレッドによって並行して行われることを除いて、組み込み関数のようなものが必要です。
これを行う良いモジュールはありますか?
標準ライブラリにこのようなものがあったと確信していましたが、間違っていたようです。
urlopen
並行したいURLがたくさんあります。map
作業が一連のスレッドによって並行して行われることを除いて、組み込み関数のようなものが必要です。
これを行う良いモジュールはありますか?
multiprocessing.Poolmap
にメソッドがあります。それは複数のプロセスを行います。
また、複数のプロセスが苦手な場合は、スレッドを使用するmultiprocessing.dummyを使用できます。
import urllib
import multiprocessing.dummy
p = multiprocessing.dummy.Pool(5)
def f(post):
return urllib.urlopen('http://stackoverflow.com/questions/%u' % post)
print p.map(f, range(3329361, 3329361 + 5))
誰かが私がこれのためにfutures
パッケージを使うことを勧めました。試してみましたが、動作しているようです。
http://pypi.python.org/pypi/futures
次に例を示します。
"Download many URLs in parallel."
import functools
import urllib.request
import futures
URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']
def load_url(url, timeout):
return urllib.request.urlopen(url, timeout=timeout).read()
with futures.ThreadPoolExecutor(50) as executor:
future_list = executor.run_to_futures(
[functools.partial(load_url, url, 30) for url in URLS])
Python モジュールQueue
が役立つ場合があります。Queue.put()
すべての URL をキューにプッシュするために使用する 1 つのスレッドを使用し、ワーカー スレッドget()
は URL を 1 つずつ単純に処理します。
関数でラップします(テストされていません):
import itertools
import threading
import urllib2
import Queue
def openurl(url, queue):
def starter():
try:
result = urllib2.urlopen(url)
except Ecxeption, exc:
def raiser():
raise exc
queue.put((url, raiser))
else:
queue.put((url, lambda:result))
threadind.Thread(target=starter).start()
myurls = ... # the list of urls
myqueue = Queue.Queue()
map(openurl, myurls, itertools.repeat(myqueue))
for each in myurls:
url, getresult = queue.get()
try:
result = getresult()
except Exception, exc:
print 'exception raised:' + str(exc)
else:
# do stuff with result