Мьютекс в Python Twisted - PullRequest
2 голосов
/ 27 июня 2009

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

Ответы [ 2 ]

2 голосов
/ 27 июня 2009

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

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

0 голосов
/ 20 августа 2009

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

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

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

...