python非阻塞socket socket 多线程 排队

# 没有测试 但是能运行 仅供小伙伴們参考 vs2017 w10
 #注意 这里是是一个元祖 我老是忘
 #因为这里是非阻塞 所以当没有链接请求时这里会产生异常
 #设置新的客户端为非阻塞
 #这里同样 因为是非阻塞 会来看是否有数据 如果没有会产生异常 
 # 这里没有异常 这里有两种情况 一种是客户端使用close()关闭链接但是没有数据 一种是有数据
 

昨天学python非阻塞socket的select的时候发现一個非常诡异的事情,到现在也没弄明白所以在这记录一下

服务端实现了一个简单的echo服务器,相关代码如下:

#通过inputs查看是否有客户端来

客戶端则是通过开启200个线程同时访问服务端代码:

#等待服务端返回数据,并输出

然后发现会报错错误信息追溯到

我自己用本办法print打印信息,发现正常情况下send消息后会再次触发select的output,再次去读queue中的信息直到空为止。

但是由于来的连接太快第一次send后没来得及第二次send就来新連接了。等处理完新连接又处理之前没来得处理的读queue,但这时候已经被删了所以就报错了。然后加了个except后就没问题了但是我发现一個问题,就是客户端使用线程并发连接的时候我发现recv会直接返回空,然后下面的逻辑判断中认为断开了链接就关掉了socket,但是紧接着又觸发了select这个时候才接受到recv的数据

,如果客户端只发起一两个socket连接就正常的


查资料说python非阻塞socket的非阻塞socket在recv的时候如果没收到消息会立马抛絀异常,但是这里又没有抛出异常所以应该不是这个原因,可是看代码和执行过程确实没有抛出异常,而是直接往下执行了然后发現没数据,就关闭了socket触发了select,然后读取到了数据可是这个逻辑也有问题,(参照上面的逻辑)因为第一次进来就把message_queues里面的队列给删了然而在后面获取message_queues[s]的时候没有出现异常,可是上面keyerror又不知道怎么解释了

唉,感觉好乱啊完全不知道这是什么情况

本人出于个人兴趣,創建了一个个人公众号每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!


我要回帖

更多关于 python非阻塞socket 的文章

 

随机推荐