一个 asyncio 任务,它打开一个 tcp 客户端来获取消息。但它不能总是得到味精。有时它阻止了
A asyncio task which open a tcp client to get msg. but It can not alway get the msg. sometimes it blocked
1.The 服务器代码
先写一个简单的tcp server。下面的代码是服务器。
import asyncio
import struct
counter = 0
async def on_connection(r: asyncio.StreamReader, w: asyncio.StreamWriter):
msg = struct.pack("HB", 3, 0)
w.write(msg)
await w.drain()
global counter
counter += 1
print(counter, "client")
async def main():
server = await asyncio.start_server(on_connection, '0.0.0.0', 12345)
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
代码将启动 tcp 服务器侦听“0.0.0.0:12345”。我用来计算有多少客户端连接到服务器。服务器 运行 在另一个 matchine 的 ip 地址是 192.168.3.2
2.The 客户代码
一个简单的客户端,用于测试和计算连接到服务器时发生的情况。
import asyncio
loop = asyncio.get_event_loop()
counter = 0
c_counter = 0
async def connection_to():
r, w = await asyncio.open_connection('192.168.3.2', 12345)
global c_counter
c_counter += 1
print(c_counter, "connected")
await r.readexactly(3)
global counter
counter += 1
print(counter, "get_msg")
async def main():
for i in range(7000):
t = loop.create_task(connection_to())
try:
loop.run_until_complete(main())
loop.run_forever()
except Exception as e:
print(e.with_traceback(None))
3。问题
请问为什么有些任务无法读取消息。
get_msg 计数 != 连接计数
backlog 太多了。
只需增加积压就可以解决问题。
提示:
把网ipv4.somaxconn也变大
1.The 服务器代码
先写一个简单的tcp server。下面的代码是服务器。
import asyncio
import struct
counter = 0
async def on_connection(r: asyncio.StreamReader, w: asyncio.StreamWriter):
msg = struct.pack("HB", 3, 0)
w.write(msg)
await w.drain()
global counter
counter += 1
print(counter, "client")
async def main():
server = await asyncio.start_server(on_connection, '0.0.0.0', 12345)
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
代码将启动 tcp 服务器侦听“0.0.0.0:12345”。我用来计算有多少客户端连接到服务器。服务器 运行 在另一个 matchine 的 ip 地址是 192.168.3.2
2.The 客户代码
一个简单的客户端,用于测试和计算连接到服务器时发生的情况。
import asyncio
loop = asyncio.get_event_loop()
counter = 0
c_counter = 0
async def connection_to():
r, w = await asyncio.open_connection('192.168.3.2', 12345)
global c_counter
c_counter += 1
print(c_counter, "connected")
await r.readexactly(3)
global counter
counter += 1
print(counter, "get_msg")
async def main():
for i in range(7000):
t = loop.create_task(connection_to())
try:
loop.run_until_complete(main())
loop.run_forever()
except Exception as e:
print(e.with_traceback(None))
3。问题
请问为什么有些任务无法读取消息。 get_msg 计数 != 连接计数
backlog 太多了。 只需增加积压就可以解决问题。 提示: 把网ipv4.somaxconn也变大