Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python recv丢失第一个字节的数据_Python_Multithreading_Optimization - Fatal编程技术网

python recv丢失第一个字节的数据

python recv丢失第一个字节的数据,python,multithreading,optimization,Python,Multithreading,Optimization,我在接收通过ssl套接字发送的消息时遇到问题。在极少数情况下,我会丢失消息中的前几个字节的数据。我很确定这在某种程度上是一个速度问题,因为它似乎只发生在两条消息快速连续发送时(间隔1-2毫秒)。我在一个单独的线程中运行接收代码,在消息到达时用最少的代码将消息转储到队列中 queue = Queue() ... def read_feed(session_key, hostname, port, ssl_socket): ''' READ whatever is coming on the s

我在接收通过ssl套接字发送的消息时遇到问题。在极少数情况下,我会丢失消息中的前几个字节的数据。我很确定这在某种程度上是一个速度问题,因为它似乎只发生在两条消息快速连续发送时(间隔1-2毫秒)。我在一个单独的线程中运行接收代码,在消息到达时用最少的代码将消息转储到队列中

queue = Queue()
...

def read_feed(session_key, hostname, port, ssl_socket):

''' READ whatever is coming on the stream '''
while (1):
    try:
        output = ssl_socket.recv(2048) # Message size always < 2048
    except (ConnectionResetError, OSError):
        logger.info("Connecting feed")
        try:
            ssl_socket.connect((hostname, port))
        except ValueError: # Something's wrong, disconnect and do a new round
            ssl_socket.close()
        else:
            cmd = {"cmd":"login", "args":{"session_key":session_key}}
            data = str.encode(json.dumps(cmd) + "\n")
            num_bytes = ssl_socket.send(data)
    else:
        queue.put(output)
...

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_socket = ssl.wrap_socket(s)
...

t3 = threading.Thread(target=read_feed, name = 'Read Feed', args=(session_key, hostname, port, ssl_socket))
t3.start()
queue=queue()
...
def read_提要(会话密钥、主机名、端口、ssl_套接字):
“阅读流中的任何内容”
而(一):
尝试:
输出=ssl_socket.recv(2048)#消息大小始终小于2048
除了(ConnectionResetError,OSError):
logger.info(“连接馈送”)
尝试:
ssl_socket.connect((主机名、端口))
除了ValueError:#出现问题,断开连接并进行新一轮
ssl_socket.close()
其他:
cmd={“cmd”:“login”,“args”:{“session_key”:session_key}
data=str.encode(json.dumps(cmd)+“\n”)
num\u bytes=ssl\u socket.send(数据)
其他:
queue.put(输出)
...
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ssl_套接字=ssl.wrap_套接字
...
t3=threading.Thread(目标=读取源,名称='读取源',args=(会话键,主机名,端口,ssl\U套接字))
t3.start()
我首先怀疑,不知何故,其他正在运行的线程占用了太多的CPU时间,因此在该线程有机会运行之前,网络缓冲区已被填满,但我尝试使用多核机器,问题仍然存在

本质上,这应该是我连接时运行的唯一代码

while (1):
    output = ssl_socket.recv(2048) # Message size always < 2048
    queue.put(output)
while(1):
输出=ssl_socket.recv(2048)#消息大小始终小于2048
queue.put(输出)
还是我在这里做出了错误的假设?可能try:/except:construct代价高昂,或者queue.put方法速度慢,我应该使用其他方法吗?或者Python不是适合这项工作的工具


有没有关于如何改进代码的建议,这样我就不会丢失那些宝贵的第一个字节?

只是想一想。。。您确定上次读取时没有收到丢失的字节吗?套接字不提供基于“消息”的通信。它们只是传输数据,当您从套接字读取数据时,您将接收其中的所有内容。无论是一条消息、部分消息还是多条消息。如果您的目的是发送消息,我建议使用ZeroMQ模块。易于使用,并提供更高的消息级接口。常见的套接字编程错误是读取套接字和处理数据,如果数据似乎有误,则忽略它。当你决定阅读时,你的1000个字符长的信息很容易就被传输了一半,在这种情况下,你只会收到前半部分,因为它太短而忽略它,然后收到其余部分,然后想知道前半部分去了哪里。很好的提示,当然数据一直都在那里!我花了这么多时间试图找出哪里出了问题,但却找错了地方。我认为数据丢失是因为电脑跟不上。丢失的数据出现在上一次传输结束时,并在处理时被丢弃,使其看起来像丢失了一些数据。只是一个想法。。。您确定上次读取时没有收到丢失的字节吗?套接字不提供基于“消息”的通信。它们只是传输数据,当您从套接字读取数据时,您将接收其中的所有内容。无论是一条消息、部分消息还是多条消息。如果您的目的是发送消息,我建议使用ZeroMQ模块。易于使用,并提供更高的消息级接口。常见的套接字编程错误是读取套接字和处理数据,如果数据似乎有误,则忽略它。当你决定阅读时,你的1000个字符长的信息很容易就被传输了一半,在这种情况下,你只会收到前半部分,因为它太短而忽略它,然后收到其余部分,然后想知道前半部分去了哪里。很好的提示,当然数据一直都在那里!我花了这么多时间试图找出哪里出了问题,但却找错了地方。我认为数据丢失是因为电脑跟不上。丢失的数据出现在上一次传输结束时,并在处理时被丢弃,使其看起来像丢失了一些数据。