URLを対応するIPに変換するスクリプトをPythonで作成しようとしています。URLファイルが巨大(10GB近く)なので、マルチプロセッシングライブラリを使おうとしています。
出力をファイルに書き込む 1 つのプロセスと、URL を変換する一連のプロセスを作成します。
これが私のコードです:
import multiprocessing as mp
import socket
import time
num_processes = mp.cpu_count()
sentinel = None
def url2ip(inqueue, output):
v_url = inqueue.get()
print 'v_url '+v_url
try:
v_ip = socket.gethostbyname(v_url)
output_string = v_url+'|||'+v_ip+'\n'
except:
output_string = v_url+'|||-1'+'\n'
print 'output_string '+output_string
output.put(output_string)
print output.full()
def handle_output(output):
f_ip = open("outputfile", "a")
while True:
output_v = output.get()
if output_v:
print 'output_v '+output_v
f_ip.write(output_v)
else:
break
f_ip.close()
if __name__ == '__main__':
output = mp.Queue()
inqueue = mp.Queue()
jobs = []
proc = mp.Process(target=handle_output, args=(output, ))
proc.start()
print 'run in %d processes' % num_processes
for i in range(num_processes):
p = mp.Process(target=url2ip, args=(inqueue, output))
jobs.append(p)
p.start()
for line in open('inputfile','r'):
print 'ori '+line.strip()
inqueue.put(line.strip())
for i in range(num_processes):
# Send the sentinal to tell Simulation to end
inqueue.put(sentinel)
for p in jobs:
p.join()
output.put(None)
proc.join()
しかし、うまくいきませんでした。いくつかの出力が生成されました (テスト ファイルの 10 個の URL のうち 4 個) が、キューが空でない間は突然停止します (queue.empty() を確認しました)。
誰が何が悪いのか提案できますか?ありがとう