Python 同时测试一对网络套接字

Python 同时测试一对网络套接字,python,sockets,Python,Sockets,我有一个appx可以在两台计算机中的任何一台上运行,但一次只能在一台上运行。我有另一个应用程序Y,用Python编写,给定两个可能的ip地址,需要找出哪台计算机正在运行应用程序X(如果有的话)。我已经部分解决了这一问题,它使用UDP服务监听端口,并在收到数据时以“Hello”响应。客户端可以尝试向每个地址的appx端口发送数据,如果收到响应,我知道应用程序正在该计算机上运行 到目前为止,我的代码如下所示: def ipaddress(self): """Test which side

我有一个appx可以在两台计算机中的任何一台上运行,但一次只能在一台上运行。我有另一个应用程序Y,用Python编写,给定两个可能的ip地址,需要找出哪台计算机正在运行应用程序X(如果有的话)。我已经部分解决了这一问题,它使用UDP服务监听端口,并在收到数据时以“Hello”响应。客户端可以尝试向每个地址的appx端口发送数据,如果收到响应,我知道应用程序正在该计算机上运行

到目前为止,我的代码如下所示:

 def ipaddress(self):
    """Test which side responds on the status port."""
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.settimeout(5)
        s.sendto("status", (ADDR_A, PORT))
        s.recvfrom(1024)
    except socket.timeout:
        try:
            s.sendto("status", (ADDR_B, PORT))
            s.recvfrom(1024)
        except:
            pass
        else:
            return ADDR_B
    else:
        return ADDR_A
    finally:
        s.close()
    return None
这个函数的问题是,每当我想与运行app X的计算机通话时,它都会定期调用。它总是先测试ADDR_A,如果它没有运行app X,那么在尝试ADDR_B之前,我必须等待套接字超时。尽管这种情况并不经常发生,但app X可以在我再次尝试时切换计算机

有更好的办法吗?我想知道是否有可能并行连接到两台计算机,并在一台计算机响应时立即返回?还是应该缓存上次调用函数时第一次响应的ip地址?我将如何编写这些或其他想法的代码

谢谢

编辑:这是我使用“选择”修改的代码:

def ipaddress(addr_a, addr_b, timeout=5):
    """Test which side responds on the status port."""

    # Create UDP sockets for each address 
    socks = [ socket.socket(socket.AF_INET, socket.SOCK_DGRAM),
              socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
              ]

    # Send some data to each socket 
    for sock, addr in zip(socks, (addr_a, addr_b)):
        sock.connect(addr)  # do explicit connect so getpeername works
        sock.send("status")

    # Wait for the first to respond if any
    while socks:
        waiting = select.select(socks, [], socks, timeout)[0]
        if waiting:
            for sock in waiting:
                try:
                    data = sock.recv(1024)
                    if data:
                        return sock.getpeername()[0]
                except Exception, e:
                    # Occasionally get [Errno 10054] which means socket isn't really
                    # available, so see if other responds instead...
                    socks.remove(sock)
        else:
            break   # timeout occurred
    return None
您应该查看哪台计算机提供了您想要的并行查看这两台计算机的功能