Как использовать многопроцессорные прокси-объекты Python в многопоточности - PullRequest
3 голосов
/ 27 февраля 2012

Я использую многопроцессорный пакет pyhton в стандартной модели клиент-сервер.
У меня есть несколько типов объектов на сервере, которые я регистрирую с помощью метода BaseManager.register и использую с клиента через прокси (на основекласс AutoProxy).

При использовании этих прокси-серверов из нескольких клиентских потоков появлялись случайные ошибки, и после некоторого чтения я обнаружил, что сами экземпляры Proxy не являются потокобезопасными.См. многопроцессорная документация Python :

Потоковая безопасность прокси
Не используйте прокси-объект из более чем одного потока, если только вы не защитите его с помощью блокировки.(Никогда не возникает проблем с разными процессами, использующими один и тот же прокси-сервер.)

Мой сценарий идеально подходит для этого.Хорошо, я знаю, почему это не удается.Но я хочу, чтобы это работало :), поэтому я обращаюсь за советом - каков наилучший способ сделать этот потокобезопасным?
В моем конкретном случае (а) я работаю с одним клиентским потоком 90% времени,(б) фактические объекты за прокси являются поточно-ориентированными, и (в) что я хотел бы хотеть одновременно вызывать несколько методов одного и того же объекта прокси.

Как всегда, Интернет, те, кто мне помогают, должны жить и никогда не умирать!Те, кто делают все возможное, тоже могут получить утешительный приз.

Спасибо,
Йонатан

1 Ответ

1 голос
/ 05 марта 2012

К сожалению, эта проблема, вероятно, не относится к слишком многим людям: (

Вот что мы делаем для будущих читателей:

  • Мы будем использовать обычныеблокировка потоков для защиты использования «основного» прокси
  • Основной прокси предоставляет прокси для других экземпляров серверного процесса, и они являются специфичными для потока в нашем контексте, поэтому мы будем использовать те, которые не имеют блокировки

Не очень интересное решение, да, я знаю. Мы также рассмотрели возможность создания специализированной версии AutoProxy (пакет поддерживает это) со встроенной блокировкой. Мы могли бы сделать это, если этот сценарий повторитсяв нашей системе. Автоблокировку следует выполнять осторожно, поскольку это делается «за кулисами» и может привести к взаимным блокировкам состояния гонки.

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

...