0

我尝试在 python 中编写一个脚本来将 url 转换为相应的 ip。由于 url 文件很大(将近 10GB),所以我尝试使用多处理库。

我创建了一个进程来将输出写入文件和一组进程来转换 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

你是工作人员在每个处理一个 url 后退出,他们需要在内部循环直到他们得到哨兵。但是,您可能应该只查看multiprocessing.pool,因为它会为您记账。

于 2013-08-21T17:22:08.150 回答