我想通过本地网络套接字将一些JSON格式的小测试数据发送到C#服务器。必须接近实时(每个循环最多5ms)。服务器工作正常,可以毫无问题地处理传入的数据。你知道吗
我的问题是:Python客户端的循环做得很好。但是在几个循环之后(有时是100个循环,有时是20000个循环,有时是100000个循环),它就冻结了!你知道吗
然后它在30-120秒之间旋转,然后继续循环(应用程序被完全阻止,即使是ALT+F4或Taskmanager在被阻止时也不会关闭应用程序)。你知道吗
看起来,本地网络冻结了我的套接字,出现了一个I/O阻塞操作,整个python客户机都在等待这个I/O阻塞操作,直到它完成,然后继续。你知道吗
如果检查输出,则有4x相同的循环时间(1.0001659393310547)。这是什么意思?可能是而真实:对于网络套接字来说太快了?!你知道吗
我很困惑。你知道吗?你知道吗
Python客户端:
import json
import socket
import time
TCP_IP = '127.0.0.1'
TCP_PORT = 5005
ITERATOR = 0
def getData():
return json.load(open('data.json'))
while True:
ITERATOR += 1
now = time.time()
_data = getData()
_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
_socket.connect((TCP_IP, TCP_PORT))
_socket.send(bytearray(str(_data).encode()))
_socket.close()
print('# %i | Loop Time (ms) : %s' % (ITERATOR, ((time.time() - now)*1000)))
输出:
# 1023 | Loop Time (ms) : 1.5003681182861328
# 1024 | Loop Time (ms) : 1.0001659393310547
# 1025 | Loop Time (ms) : 1.0001659393310547
# 1026 | Loop Time (ms) : 1.0001659393310547
# 1027 | Loop Time (ms) : 1.0001659393310547
# 1028 | Loop Time (ms) : 1.5001296997070312
...
AND THEN IT FREEZES !!!! It freezes for some seconds/minutes and the goes on...
发送后立即关闭套接字会产生未指定的行为。数据可能已被发送或未被发送,因为发送调用会在数据排队后立即返回,并且争用条件可能会导致关闭在数据发送之前销毁套接字。你知道吗
有两种方法可以可靠地关闭插座:
在关闭前使用SO_LINGER选项
使用graceful shutdown
相关问题 更多 >
编程相关推荐