2014-12-19 4 views
0

Я хочу TraceRoute некоторые IP в файле с GEvent, вот мой код:Как судить весь подпроцесс в gevent?

#!/usr/bin/env python 
import gevent 
from gevent import subprocess 
gevent.monkey.patch_thread 

ip_list = open('ips.txt') 
data = [i for i in ip_list] 
length = len(data) 

process_pool = [] 

for i in range(length): 
    process = subprocess.Popen(['sudo','traceroute','-T', '-m', '8', data[i]], stdout=subprocess.PIPE) 
    process_pool.append(process) 

print len(process_pool) 

gevent.wait(process_pool, timeout=10) 

count = 0 

for i in process_pool: 
    if i.poll() is not None: 
    count += 1 
    print i.stdout.read() 
    else: 
    print ('job is still running') 

print count 

это работает хорошо, но я не знаю, как увидеть, если все трассировку закончится, если я изменю значение таймаута. Весь процесс может закончиться, но я не знаю, сколько ip в файле, поэтому код не может иметь дело с обычным случаем. Как это исправить?

ответ

1

На самом деле, я просто хочу, чтобы использовать GEvent, чтобы увидеть скорость кода, так что я могу использовать такой код, он достаточно быстро для моей работы:

#!/usr/bin/python 

import gevent 
from gevent import monkey, subprocess 
gevent.monkey.patch_thread 

all_data = [] 

def my_trace(ip_addr): 
    process = subprocess.Popen(['sudo','traceroute','-T','-m','8', ip_addr], stdout=subprocess.PIPE) 
    all_data.append(process.stdout.read()) 

ip_list = open('ips.txt') 
data = [i for i in ip_list] 
jobs = [gevent.spawn(my_trace, line) for line in data] 
gevent.wait(jobs) 

for i in all_data: 
    print i 

print len(all_data) 

И я просто ждать весь конец traceroute, вот и все.

+0

вы можете использовать 'subprocess.check_output()' для получения всего вывода сразу – jfs

 Смежные вопросы

  • Нет связанных вопросов^_^