Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Client Server - Fatal编程技术网

Python recv上的可读套接字超时

Python recv上的可读套接字超时,python,sockets,client-server,Python,Sockets,Client Server,我有一个“作业”服务器,它接受来自客户端的请求。有8个客户端从另一台机器发送请求。然后服务器提交一个“作业”一个“作业”只是一个将结果文件写入磁盘的可执行文件,在“作业管理器”线程上等待作业完成。作业完成后,它会向客户端发送一条消息,表明结果文件已准备好复制回客户端 在主线程上,我使用select读取来自客户端的传入连接以及作业请求: readable, writable, exceptional = select.select(inputs, [], []) 其中inputs是接受的连接套接

我有一个“作业”服务器,它接受来自客户端的请求。有8个客户端从另一台机器发送请求。然后服务器提交一个“作业”一个“作业”只是一个将结果文件写入磁盘的可执行文件,在“作业管理器”线程上等待作业完成。作业完成后,它会向客户端发送一条消息,表明结果文件已准备好复制回客户端

在主线程上,我使用select读取来自客户端的传入连接以及作业请求:

readable, writable, exceptional = select.select(inputs, [], [])
其中inputs是接受的连接套接字的列表,该列表还包括服务器套接字。所有插座均设置为非阻塞。据我所知,如果调用select返回一个非空的可读数据,这意味着输入的某些元素有等待读取的传入数据。 我使用以下逻辑读取数据:大小为常数:

for s in readable:
    if s is not server:
        try:
            socket_ok = True
            data = s.recv(SIZE)
        except socket.error as e:        
            print ('ERROR socket error: ' + str(e) )
            socket_ok = False
        except Exception as e:
            print ('ERROR error reading from socket: ' + str(e))
            socket_ok = False
        if not socket_ok:
            # do something
我有两个问题:

有时我会遇到[Errno 110]连接超时异常,我不明白为什么——如果我有一个可读的套接字,这不意味着它有一些数据要读取吗? 如何处理这个异常-做某事部分。我可以进行“清理”-删除超时套接字请求的正在运行的作业,并从列表中删除死套接字。但我无法让客户知道,他们应该停止等待这些工作的结果。理想情况下,我希望以某种方式重新连接,因为工作本身一直在运行,并产生我不想丢掉的结果。
编辑我现在意识到,作业管理器线程也可以通过队列实例访问套接字-如果作业完成,线程会通过相关套接字发送“作业完成”消息-因此,同一套接字的send和recv方法可能会导致某种竞争条件?但无论如何,我看不出这怎么会导致“连接超时”错误。

这是一个解决方案,只是一个猜测,似乎有效:在客户端,我使用阻塞recv方法从服务器获取消息,表明任务已完成。由于一个作业可能需要很长时间,例如,如果运行作业的集群资源不足,我猜可能是套接字等待导致超时。因此,我没有在阻塞模式下使用recv,而是在超时时间为5秒的情况下使用它,因此我可以每5秒向服务器发送一条虚拟消息,以保持连接处于活动状态,直到收到消息为止。现在,我在服务器端不再出现异常。

尝试阅读此处的详细信息:@ReutSharabani,我阅读了它,实际上我的代码就是基于它编写的。但您可以在我的代码中看到,从readbale列表中的套接字读取时引发异常,并且您提到的链接表示可读列表中的所有套接字都缓冲了传入数据并可供读取,因此这并不能解释我遇到的问题