0

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() を確認しました)。

誰が何が悪いのか提案できますか?ありがとう

4

1 に答える 1

1

ワーカーは、それぞれ 1 つの URL を処理した後に終了します。センチネルを取得するまで、内部でループする必要があります。ただし、代わりにmultiprocessing.poolを確認する必要があります。これにより、簿記が行われます。

于 2013-08-21T17:22:08.150 に答える