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

2024-09-27 21:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有许多进程在运行,这些进程是由远程客户端控制的。tcp服务器控制对这些进程的访问,每个进程只有一个客户端。为进程指定的id号范围为0->;n-1。WARE'n'是进程数。我使用字典将这个id映射到客户机套接字文件描述符。在启动时,我用id作为键填充字典,并为值填充“None”的socket fd,即没有客户端和所有poces可用

当客户机连接时,我将id映射到sockets fd。当客户机断开连接时,我将这个id的值设置为None,即进程可用。所以每次客户机连接时,我都要检查字典中的每个条目,看是否有一个socket fd entry为None的进程。如果存在,则允许客户端连接。在

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

谢谢


Tags: 文件gt服务器noneid客户端客户机字典
3条回答

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

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

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

“过早的优化是万恶之源,”C.A.R.Hoare说。在

与其问这个实现是否有效,不如问问这个实现是否足够有效。如果它满足您的性能需求,并且代码易于理解,那么您也许应该让它保持原样。在

如果您的代码不能提供所需的性能,我建议Shin给出答案。这似乎是获得额外性能的最简单方法。在

为什么不只用一张单子呢?Python列表是后台的数组,具有O(1)访问权限。在

sockets = n * [None]

然后,一旦您了解了给定进程id的套接字:

^{pr2}$

相关问题 更多 >

    热门问题