错误源以及问题说明
循环 connectionlist,然后对报错的 websocket 进行剔除,一对多,广播给多个连接。但是里面多少会有断开的,所以会报 BrokenPipe,即线程不可用。 那么就要从我的连接管理里边剔除,但是其他的线程仍然在执行广播,所以会检测到这循环的过程中整个队列的 size 减少了,就会报出以上错误:
RuntimeError: dictionary changed size during iteration
解决思路
简单从报错来看,这个问题是说在迭代的过程中改变了字典的大小。 举个简单的例子如下:
我尝试迭代list(dict) 实现:
更接近实际情况的是:
在一个循环中改变 a 的值,然后判别条件变化这个循环还在继续:
简单抽象出来可以这样写:
按照同样的思路套用在业务问题上就解决了以上问题。