Вот что я сделаю (я действительно собираюсь написать эту библиотеку после того, как увижу ваш вопрос. Мне это тоже нужно):
Создайте модуль taskpool
со следующим API.
client_id, token = taskpool.get()
# Setup a heartbeat in the client JS, maybe every minute.
# Also call this every time the client indicates presence
taskpool.ping(client_id)
taskpool.release(client_id)
Реализация:
- Сохраните
client_id
и token
в объекте со статусом, указывающим, используется ли он, время последнего пинга и время создания. Пусть client_id
будет ключом. Также рассмотрите возможность использования NDB . Бесплатное memcaching.
get()
проверяет наличие неиспользованных токенов и возвращает один, если находит его. В противном случае создайте новый, сохраните и верните его.
ping()
обновляет время последнего пинга для этого токена. Вместо того, чтобы опрашивать, пусть клиент отправляет пинг каждый раз [сердцебиение].
release()
помечает токен как неиспользованный.
Запускайте задание / cron каждые [сердцебиение] секунды, чтобы найти токены, которые не получили пинг за некоторое время, - и установите их как неиспользуемые.
Когда клиенты сообщают о закрытом токене, выполните get()
.
Имейте в виду, однако, что потеря в безопасности является побочным продуктом любого вида объединения токенов. Если злонамеренный клиент удержал токен и прекратил отправлять тактовые импульсы, он позже сможет прослушивать сообщения, передаваемые новому клиенту, после повторного назначения токена. Это не проблема, если вы находитесь на общедоступном сайте, но помните об этом в любом случае.
Я обновлю этот ответ, если и когда напишу это как библиотеку.