2013-08-21 26 views
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() 

然而,它没有工作。它没有产生几个输出(4出在测试文件10页的URL),但它只是突然停止,而队列是不是空的(我没有检查queue.empty())

任何人都可以提出什么问题?谢谢

回答

1

你是工作人员在处理完一个url之后退出,他们需要在内部循环,直到他们得到标记。但是,您可能应该只考虑multiprocessing.pool,因为它为您提供簿记服务。