2016-03-18 1 views
0

Я использую gevent для опроса нескольких сокетов, чтобы увидеть, открыт ли один из указанных портов. Как сделать gevent прекратить опрос, если один из сокетов преуспеет?Позвольте gevent прекратить опрос, когда один сокет успешно завершен

import gevent 
from gevent import socket 

vm_ip = "10.3.12.2" 
ports = [22, 16120, 16122] 
def fn(port): 
    while True: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.settimeout(5) 
     result = s.connect_ex((vm_ip, port)) 
     s.close() 
     if result == 0: 
      return 

jobs = [gevent.spawn(fn, port) for port in ports] 
gevent.joinall(jobs, timeout=30) 

ответ

0

Вы можете просто установить флаг в своем цикле while и отключить этот флаг, когда найдете результат. Greenlets - это сопрограммы, а не потоки, поэтому никаких проблем при этом не возникает:

import gevent 
from gevent import monkey 
monkey.patch_all() 
from gevent import socket 

vm_ip = "10.3.12.2" 
ports = [22, 16120, 16122] 
found = False 
def fn(port): 
    while not found: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.settimeout(5) 
     result = s.connect_ex((vm_ip, port)) 
     s.close() 
     if result == 0: 
      found = True 
      return 

jobs = [gevent.spawn(fn, port) for port in ports] 
gevent.joinall(jobs, timeout=30) 
Смежные вопросы