队列不为空时进程停止工作

时间:2013-08-21 17:12:05

标签: python queue multiprocessing

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

我创建了一个将输出写入文件的进程和一组转换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个网址中有4个),但是当队列不为空时它突然停止(我确实检查了queue.empty())

有人能说出什么问题吗?谢谢

1 个答案:

答案 0 :(得分:1)

你是工人在处理每个网址后退出,他们需要在内部循环,直到他们获得哨兵。但是,你应该只看一下multiprocessing.pool,因为这会为你做簿记。