2012-10-09 33 views
1

我正在嘗試解析主機名列表。問題是當我打到一個不存在的域時,它會減慢整個過程。該代碼是用於循環一個微不足道的:與Python並行解析和保存主機名

for domain in domains: 
    try: 
     if socket.gethostbyname(domain.split('@')[1]): 
      file1.write(domain) 
     else: 
      file2.write(domain) 
    except socket.gaierror: 
     pass 

我想知道如果有一個簡單的方法來並行裏面是什麼for循環。

回答

5

您可以使用Gevent的一個示例 - dns_mass_resolve.py。對於所有查詢還有設置超時的可能性。

from __future__ import with_statement 
import sys 
import gevent 
from gevent import socket 
from gevent.pool import Pool 

N = 1000 
# limit ourselves to max 10 simultaneous outstanding requests 
pool = Pool(10) 
finished = 0 


def job(url): 
    global finished 
    try: 
     try: 
      ip = socket.gethostbyname(url) 
      print ('%s = %s' % (url, ip)) 
     except socket.gaierror: 
      ex = sys.exc_info()[1] 
      print ('%s failed with %s' % (url, ex)) 
    finally: 
     finished += 1 

with gevent.Timeout(2, False): 
    for x in xrange(10, 10 + N): 
     pool.spawn(job, '%s.com' % x) 
    pool.join() 

print ('finished within 2 seconds: %s/%s' % (finished, N)) 
0
import thread 

def resolve_one_domain(domain): 
    ... 

for domain in domains: 
    thread.start_new_thread(resolve_one_domain, [domain])