Python 为什么我的列表总是不符合顺序?

Python 为什么我的列表总是不符合顺序?,python,list,networking,Python,List,Networking,我正在使用Python后端服务器开发一个多人Flash游戏,服务器出现了一些问题 我正在为服务器使用异步TCP套接字(使用select),我还维护一个“发送队列”,其中数据包按发送顺序排队,然后在select告诉我套接字可写时发送 基本上,它的结构如下: (注意:每个“数据包”都有一个相关的套接字) 乍一看,这对我来说似乎很好,但我的发送队列似乎出现了故障 它似乎总是在相同的顺序,但不是正确的顺序。例如,服务器向客户端发送一些聊天数据包,将它们介绍给服务器。我是这样做的: player.send

我正在使用Python后端服务器开发一个多人Flash游戏,服务器出现了一些问题

我正在为服务器使用异步TCP套接字(使用
select
),我还维护一个“发送队列”,其中数据包按发送顺序排队,然后在
select
告诉我套接字可写时发送

基本上,它的结构如下:

(注意:每个“数据包”都有一个相关的套接字)

乍一看,这对我来说似乎很好,但我的发送队列似乎出现了故障

它似乎总是在相同的顺序,但不是正确的顺序。例如,服务器向客户端发送一些
聊天
数据包,将它们介绍给服务器。我是这样做的:

player.sendMessage("Welcome to Nanoxide's public server, " + player.getName() + "!")
player.sendMessage("The server is version " + self.getServer().getVersion())
player.sendMessage("and it is running under " + str(int(psutil.cpu_percent())) + "% CPU load.")
player.sendMessage("")

self.getServer().broadcastMessage(player.getName() + " joined the game")
但是,它总是按以下顺序到达:

This server is version <version>
<blank line>
Welcome to Nanoxide's public server, <playername>!
<playername> joined the game
此服务器的版本为
欢迎使用Nanoxide的公共服务器!
加入游戏
(注意:到目前为止,我只测试了一个连接) 我不太清楚是什么原因造成的。我不认为这是线程干扰(因为有时发送队列可能会被多个线程修改),因为我使用了threading.Lock,无序性总是以相同的顺序出现,只是不是以我放入数据包的顺序出现

我怀疑这个问题与我在这个问题开始时概述的“网络”循环有关——可能是因为有时数据包没有发送,因为它不是为指定的数据包而发送的,并且它在列表中穿洞,使其无序


你认为问题出在哪里,我还做错了什么,你会如何解决?每个套接字的发送队列而不是全局队列?

基于伪代码,您似乎在对队列进行迭代时修改了队列。这可能很危险。例如:

>>> x = range(10)
>>> for i in x:
...     print i
...     if i%2==0:
...             x.remove(i)
... 
0
2
4
6
8
>>> x = range(10)
>>> for i in x[:]:
...     print i
...     if i%2==0:
...             x.remove(i)
... 
0
1
2
3
4
5
6
7
8
9
解决这个问题的一种方法是创建iterable的副本。例如:

>>> x = range(10)
>>> for i in x:
...     print i
...     if i%2==0:
...             x.remove(i)
... 
0
2
4
6
8
>>> x = range(10)
>>> for i in x[:]:
...     print i
...     if i%2==0:
...             x.remove(i)
... 
0
1
2
3
4
5
6
7
8
9

我们可以看看你的
sendMessage
方法吗?再给我们一些代码![但您究竟使用什么作为队列容器?]+1并回答。我没有意识到在迭代过程中修改列表是危险的——感谢您从很少的代码中收集到了这一点。问题解决了。