python字典是解决这个问题的最佳数据结构吗?

时间:2010-06-13 12:24:44

标签: python dictionary

我运行了许多由远程客户端控制的进程。 tcp服务器控制对这些进程的访问,每个进程只有一个客户端。给出的过程的id值在0-> 0的范围内。 n-1个。是'n'是进程的数量。我使用字典将此id映射到客户端套接字文件描述符。在启动时,我使用id作为键填充字典,使用'None'的套接字fd填充值,即没有客户端和所有pocesses可用

当客户端连接时,我将id映射到套接字fd。当客户端断开连接时,我将此id的值设置为None,即进程可用。因此,每次客户端连接时,我都必须检查字典中的每个条目,以查找具有套接字fd条目为None的进程。如果有,则允许客户端连接。

这个解决方案似乎不太优雅,是否有其他数据结构更适合解决这个问题?

由于

3 个答案:

答案 0 :(得分:2)

你可以保留这个想法,但添加一个列表或任何保留未使用的socked fd的内容,这样你就不必迭代字典来找到第一个可用的“None”。当您从“不忙”列表中选择第一个(或最后一个)免费进程时,将从中删除。 E.g。

# d is the dictionary
# notbusy is a list
d[ notbusy.pop() ] = ... # init the socket

当然你必须检查notbusy是不是空的(如果你愿意,还可以试试);如果是,则没有可用的“插槽”并且无法连接。当使用的插槽被“释放”时,您将其设置为“无”并将其键添加到列表notbusy。

答案 1 :(得分:1)

为什么不使用列表? Python列表是幕后的数组,具有O(1)访问权限。

sockets = n * [None]

然后,一旦你学习了给定进程id的套接字:

sockets[id] = socket;

答案 2 :(得分:0)

“过早优化是所有邪恶的根源”,如C.A.R.霍尔说。

不是问这个实现是否有效,也许你应该问这个实现是否有效足够。如果它符合您的性能要求并且代码易于理解,那么您应该留下它。

如果您的代码没有为您提供所需的性能,我建议Shin的回答。这似乎是获得额外性能的最简单方法。