multiprocessing
モジュールを使用して、並行URLを取得しています。問題があるPython:マルチプロセッシングを使用する場合の処理された要素の数を確認してください。
pat = re.compile("(?P<url>https?://[^\s]+)")
def resolve_url(text):
missing = 0
bad = 0
url = 'before'
long_url = 'after'
match = pat.search(text) ## a text looks like "I am at here. http:.....(a URL)"
if not match:
missing = 1
else:
url = match.group("url")
try:
long_url = urllib2.urlopen(url).url
except:
bad = 1
return (url, long_url, missing, bad)
if __name__ == '__main__':
pool = multiprocessing.Pool(100)
resolved_urls = pool.map(resolve_url, checkin5) ## checkin5 is a list of texts
、私のcheckin5
リストは周り60万要素が含まれており、この並列作業は本当に時間がかかる:私のコードは次のようです。私は、どのように多くの要素が解決されたのかをチェックしたいと思う。ループのためのシンプルであれば、私はこのような操作を行うことができます。
resolved_urls = []
now = time.time()
for i, element in enumerate(checkin5):
resolved_urls.append(resolve_url(element))
if i%1000 == 0:
print("from %d to %d: %2.5f seconds" %(i-1000, i, time.time()-now))
now = time.time()
しかし、今、私は効率を上げるために必要なので、マルチプロセスが必要であるが、私は、この場合にはいずれかのプロセスを検査する方法がわかりませんアイディア?ところで
は、上記の方法は、この場合にも機能するかどうかをチェックするために、私はおもちゃのコードを試みた:import multiprocessing
import time
def cal(x):
res = x*x
return res
if __name__ == '__main__':
pool = multiprocessing.Pool(4)
t0 = time.time()
result_list = pool.map(cal,range(1000000))
print(time.time()-t0)
t0 = time.time()
for i, result in enumerate(pool.map(cal, range(1000000))):
if i%100000 == 0:
print("%d elements have been calculated, %2.5f" %(i, time.time()-t0))
t0 = time.time()
をし、結果は以下のとおりです。
0.465271949768
0 elements have been calculated, 0.45459
100000 elements have been calculated, 0.02211
200000 elements have been calculated, 0.02142
300000 elements have been calculated, 0.02118
400000 elements have been calculated, 0.01068
500000 elements have been calculated, 0.01038
600000 elements have been calculated, 0.01391
700000 elements have been calculated, 0.01174
800000 elements have been calculated, 0.01098
900000 elements have been calculated, 0.01319
結果から、Iここではシングルプロセスのメソッドが機能しないと考えています。の後にpool.map
が最初に呼び出され、が計算され、完全なリストが得られたら、enumerate
が始まります。
'pool.map(resolve_url、checkin5)'を列挙し、出力リストに追加しますか? –
@YakymPirozhenko列挙型がリアルタイムであるのか、実際にはすべての要素が処理されたのかは疑問に思っていた。 – gladys0313
@YakymPirozhenkoすべての要素が処理された後、列挙されると思う私の編集した質問で、簡単なtryを追加しました – gladys0313