2016-03-18 1 views
0

J'utilise gevent pour interroger plusieurs sockets juste pour voir si l'un des ports spécifiés est ouvert. Comment faire un gevent arrêter d'interroger si l'un des sockets réussit?Laisser le gevent arrêter l'interrogation lorsqu'une socket réussit

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) 

Répondre

0

Vous pouvez simplement définir un indicateur dans votre boucle while et désactiver ce drapeau lorsque vous avez trouvé le résultat. Les Greenlets sont des coroutines, pas des threads, donc pas de problème pour ce faire:

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)