使用python3进行连接



我试图同时连接多个服务器。我目前正在使用loop.create_connection,但它在第一个无响应的服务器上冻结。

gsock = loop.create_connection(lambda: opensock(sid), server, port)
transport, protocol = loop.run_until_complete(gsock)

我尝试线程这,但它产生的问题与sid值被使用以及各种错误,如RuntimeError: Event loop is runningRuntimeError: Event loop stopped before Future completed。此外,根据我的变量(虽然混淆了),当transport, protocol = loop.run_until_complete(gsock)抛出异常时,协议的connection_made()方法被执行。

我不太了解asyncio模块,所以请尽可能彻底。我不认为我需要读取/写入变量,因为读取应该自动完成并触发data_received()方法。

谢谢。

您可以通过并发调度所有协程来同时连接多个服务器,而不是使用loop.run_until_complete单独建立每个连接。一种方法是使用asyncio.gather来调度它们并等待它们完成:

import asyncio
# define opensock somewhere
@asyncio.coroutine
def connect_serv(server, port):
    try:
        transport, protocol = yield from loop.create_connection(lambda: opensock(sid), server, port)
    except Exception:
        print("Connection to {}:{} failed".format(server, port))
loop = asyncio.get_event_loop()
loop.run_until_complete(
    asyncio.gather(
      connect_serv('1.2.3.4', 3333),
      connect_serv('2.3.4.5', 5555),
      connect_serv('google.com', 80),
 ))
loop.run_forever()

这将并发地启动gather调用中列出的所有三个协程,因此如果其中一个挂起,其他的不会受到影响;当另一个连接中断时,他们可以继续工作。然后,如果它们全部完成,则执行loop.run_forever(),这将允许您的程序继续运行,直到停止循环或终止程序。

您提到的reader/writer变量只有在您使用asyncio.open_connection而不是create_connection连接到服务器时才相关。它使用流API,这是一个比create_connection使用的基于协议/传输的API更高级别的API。使用哪一种完全取决于你自己。在asyncio文档中有两个例子,如果你想看一个比较。

相关内容

  • 没有找到相关文章

最新更新