Python网络SocketClient偶尔冻结

2024-04-19 08:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过本地网络套接字将一些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...

Tags: importip服务器loopjson应用程序客户端data
1条回答
网友
1楼 · 发布于 2024-04-19 08:19:27

发送后立即关闭套接字会产生未指定的行为。数据可能已被发送或未被发送,因为发送调用会在数据排队后立即返回,并且争用条件可能会导致关闭在数据发送之前销毁套接字。你知道吗

有两种方法可以可靠地关闭插座:

  • 在关闭前使用SO_LINGER选项

    _socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
                       struct.pack('ii', 1, 0))
    
  • 使用graceful shutdown

    _socket.shutdown(socket.SHUT_WR) # shutdown the socket
    _socket.read() # wait the close from peer
    _socket.close()
    

相关问题 更多 >