2009-10-19 3 views
7

Я ищу способ предотвратить запуск несколькими одновременными командами для прослушивателя XMLRPC на Python. Слушатель отвечает за запуск сценариев для выполнения задач в этой системе, которые потерпят неудачу, если несколько пользователей попытаются выпустить эти команды одновременно. Есть ли способ заблокировать все входящие запросы, пока один экземпляр не завершит?Python XMLRPC с параллельными запросами

+1

являются ли клиенты осведомленными о матрице конфликта? должны ли они быть достаточно умными, чтобы планировать себя в соответствии с этой матрицей? как они выполняют синхронизацию и т. д. ... – jldupont

+0

вы используете SimpleXMLRPCServer, так как я думал, что это однопоточный ... – SeriousCallersOnly

+0

Я использую SimpleXMLRPCServer, но, похоже, я могу запустить ту же команду с разных хостов одновременно, что и есть необходимо предотвратить – MattB

ответ

15

Я думаю, что модуль SimpleXMLRPCServer python - это то, что вы хотите. Я считаю, что поведение по умолчанию этой модели блокирует новые запросы при обработке текущего запроса. Поведение по умолчанию дало мне массу проблем, и я изменил это поведение путем смешивания в классе ThreadingMixIn, чтобы сервер xmlrcc мог отвечать на несколько запросов одновременно.

class RPCThreading(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer): 
    pass 

Если я правильно понял ваш вопрос, SimpleXMLRPCServer - это решение. Просто используйте его напрямую.

+0

+1, что идеально! –

0

У вас есть другой канал связи? Если «да», то между сервером и клиентами будет выполняться протокол «перезвони мне, когда моя очередь».

Другими словами, каждый клиент зарегистрирует свое намерение выдавать запросы серверу, и указанный сервер «обратится» к следующему клиенту, когда он будет готов.

+0

Я не обязательно так же беспокоюсь о вызове клиентов, что в предотвращении противоречивых команд, выдаваемых несколькими хостами – MattB

+0

, вы можете отправить код HTTP 5xx (сервер занят или что-то еще)? – jldupont

+0

Что определяет «конфликтующие команды»? – jldupont

0

Есть несколько вариантов: сервер

  1. Использование однопроцессный-один поток, как SimpleXMLRPCServer для обработки запросов в дальнейшем.
  2. Используйте threading.Lock() в потоковом сервере.
  3. Вы используете внешний механизм блокировки (например, модуль lockfile или GET_LOCK() в mysql) на многопроцессорном сервере.
Смежные вопросы