【发布时间】:2017-05-26 07:59:41
【问题描述】:
我正在使用 python asyncio 流连接到多个套接字服务器,但是当服务器关闭时,我的代码无法自动重新连接。
我需要的是,当服务器关闭时,我的脚本将尝试每 5 秒重新连接一次,直到连接并再次开始解析数据。
import asyncio
server1 = {'host': '192.168.1.51', 'port': 11110}
server2 = {'host': '192.168.1.52', 'port': 11110}
async def tcp_client(host, port, loop):
print('connect to server {} {}'.format(host, str(port)))
reader, writer = await asyncio.open_connection(host, port, loop=loop)
while True:
data = await reader.read(100)
print('raw data received: {}'.format(data))
await asyncio.sleep(0.1)
loop = asyncio.get_event_loop()
try:
for server in [server1, server2]:
loop.run_until_complete(tcp_client(server['host'], server['port'], loop))
print('task added: connect to server {} {}'.format(server['host'], server['port']))
finally:
loop.close()
print('loop closed')
【问题讨论】:
-
首先您的代码将无法运行:您无法使用点符号访问字典中的项目 - 使用
server['host']或server.get('host')。 -
另一个问题是
loop.run_until_complete()一直运行到它完成,即它阻塞。因此,一次只能连接一台服务器。 -
还有一个问题是
tcp_client()需要检查连接是否关闭。你可以知道当data是空字符串时 - 然后从函数中返回。 -
1.我已经更正了代码。 2.所以我需要使用loop.call_soon()而不是loop.run_until_complete()来运行任务? 3.我可以使用len(data) == 0来检查连接是否关闭?
-
2.考虑使用asyncio.gather 或asyncio.wait 3. 见StreamReader.at_eof
标签: python sockets python-asyncio asyncsocket