Python 当一个套接字成功时,让gevent停止轮询

Python 当一个套接字成功时,让gevent停止轮询,python,gevent,Python,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.

我正在使用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)

您只需在while循环中设置一个标志,并在找到结果时关闭该标志。Greenlet是协程,而不是线程,因此这样做没有问题:

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)