Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 队列不为空时进程停止工作_Python_Queue_Multiprocessing - Fatal编程技术网

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

Python 队列不为空时进程停止工作,python,queue,multiprocessing,Python,Queue,Multiprocessing,我尝试用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.

我尝试用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()


有人能告诉我出了什么问题吗?谢谢你的员工在处理完每个url后退出,他们需要在内部循环,直到得到哨兵。然而,你可能只需要看一下,因为这会帮你记账