Является ли словарь Python лучшей структурой данных для решения этой проблемы? - PullRequest
0 голосов
/ 13 июня 2010

У меня есть несколько запущенных процессов, которые управляются удаленными клиентами.Сервер tcp контролирует доступ к этим процессам, только один клиент на процесс.Процессам присваивается идентификационный номер в диапазоне 0 -> n-1.Где 'n' - это число процессов.Я использую словарь для сопоставления этого идентификатора с дескриптором файла сокетов клиента.При запуске я заполняю словарь идентификаторами в качестве ключей и сокетом fd 'None' для значений, т.е. нет доступных клиентов и всех процессов

Когда клиент подключается, я сопоставляю идентификатор с сокетами fd.Когда клиент отключается, я устанавливаю для этого идентификатора значение None, т.е. процесс доступен.Поэтому каждый раз, когда клиент подключается, я должен проверять каждую запись в словаре на наличие процесса, у которого в сокете есть запись None.Если есть, то клиенту разрешено подключаться.

Это решение не выглядит очень элегантным, есть ли другие структуры данных, которые были бы более подходящими для решения этой проблемы?

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 июня 2010

Вы можете сохранить эту идею, но добавить список или что-то еще для хранения неиспользуемого socked fd, так что вам не придется перебирать словарь, чтобы найти первое пригодное для использования "None".Когда вы выбираете первый (или последний) свободный процесс из списка «не занят», вы удаляете его.Например,

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

конечно, вы должны проверить, что notbusy не пуст (или попробовать, если хотите);если это так, нет свободного используемого слота и невозможно подключиться.Когда используемый слот «освобожден», вы устанавливаете None и добавляете его ключ в список notbusy.

1 голос
/ 13 июня 2010

Почему бы просто не использовать список? Списки Python - это закулисные массивы с доступом O (1).

sockets = n * [None]

Затем, как только вы изучите сокет для данного идентификатора процесса:

sockets[id] = socket;
0 голосов
/ 13 июня 2010

«Преждевременная оптимизация - корень всего зла», как сказал CAR Hoare.

Вместо того, чтобы спрашивать, эффективна ли эта реализация, возможно, вам следует спросить, эффективна ли эта реализация достаточно ,Если он соответствует вашим требованиям к производительности и код прост для понимания, возможно, вам следует оставить его таковым.

Если ваш код не дает необходимой вам производительности, я бы предложил ответ Шина.Кажется, это самый простой способ получить дополнительную производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...