2009-06-26 3 views
2

Я использую Twisted framework и получаю RPC асинхронно. У меня есть другая функция, которая выполняет задание каждые 2 секунды и спит между ними. Это вызвано через реактор.callInThread. Они зависят от общих ресурсов, поэтому мне нужен потокобезопасный способ доступа к ним. Как можно использовать критические разделы/мьютексы/блокировки в скрученном?Mutex в Python Twisted

ответ

2

Хотя вы можете использовать потоки в скрученном виде, обычная идиома с скрученной - это делать RPC асинхронно с использованием одного потока. Это одно из его преимуществ. Скрученная структура запускает реактор и вызывает события вашего обработчика, когда результаты RPC готовы для вас. Затем ваш код запускается, и когда ваш обработчик выходит, управление возвращается обратно в реактор, который вызовет следующего обработчика с готовым кодом. Поэтому, несмотря на то, что в paralell происходит много вещей, скручивание гарантирует, что одновременно будет выполняться только одна из ваших функций, поэтому вам не нужно будет использовать mutexing, просто сохраняя переменные состояния, чтобы ваши обратные вызовы знали, каков текущий контекст, который они представляют достаточно работать.

Если вы явно создаете темы и используете их с запущенным фреймворком, вам, вероятно, понадобится что-то вроде Standard Python Mutex, хотя вам нужно быть очень осторожным, чтобы никогда не использовать ваш основной поток обратного вызова Reactor для мьютекса любой промежуток времени, поскольку обратные вызовы внутри реактора не должны блокироваться.

+0

hmm ok. Ну, если быть более конкретным, у меня есть один вызов функции, выполняемый в результате работы «reactor.callInThread». Эта функция выполняет что-то каждые 2 секунды. Как работает реактор? Я хочу убедиться, что RPC не запускается одновременно с тем, что эта функция что-то делает. – 2009-06-26 23:21:48

+0

hah - это ответ на использование задачи. Локация вместо этого? – 2009-06-26 23:22:23

+0

Если вы не используете многопоточный подход для повышения производительности (масштабирование процессора и т. Д.), А функция в другом потоке не работает слишком долго, не выходя из нее (чтобы заблокировать поток реактора), это, казалось бы, приемлемо. Честно говоря, если вам нужен поточный подход, я не уверен, что правильный способ сделать мьютексинг - это то, что поток реакторов не блокируется. – bdk

0

Twisted позволяет записывать управляемый событиями код в одном потоке. Несколько событий могут безопасно обрабатывать стандартные поточные структуры данных Python, а в качестве мьютексов могут использоваться не потокобезопасные структуры данных. Если вы do начните использовать темы, тогда вам придется беспокоиться об этих вещах. Но вам не нужно их использовать.

Итак, как прокомментировали: используйте task.LoopingCall или реактор.CallLater для вашей задачи. Никогда не называть time.sleep(), чтобы реактор вызывал вашу задачу в нужное время (и выполнял другую работу). Отвечайте на свои RPC по мере их поступления.

Не будет двух потоков, запускающих ваш код сразу. Однако вы не знаете порядок, в котором будут вызываться ваши обратные вызовы. Как только вы откажетесь от контроля до отложенного, состояние приложения может измениться к моменту его возвращения.