Twisted - должен ли этот код выполняться в отдельных потоках - PullRequest
1 голос
/ 16 декабря 2010

Я запускаю некоторый код, в котором есть X работников, каждый из которых вытягивает задачи из очереди каждую секунду Для этого я использую функцию Twisted task.LoopingCall(). Каждый работник выполняет свой запрос (очищает некоторые данные), а затем отправляет ответ обратно в другую очередь. Все это делается в потоке реактора, поскольку я не откладываю это ни на какой другой поток.

Мне интересно, должен ли я запускать все эти задания в отдельных потоках или оставить их как есть. И если да, то есть ли проблема, если я вызываю task.LoopingCall каждую секунду из каждого потока?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Нет, вы не должны использовать темы.Вы не можете вызвать LoopingCall из потока (если вы не используете reactor.callFromThread), но это не поможет вам ускорить ваш код.

Если вы заметили проблему с производительностьюВы можете профилировать свою рабочую нагрузку, выяснить, где нагрузка на процессор, а затем поместить эту работу в несколько процессов , порожденных spawnProcess.Вы действительно не можете пропустить шаг, где вы узнаете, где стоит дорогая работа: нет никакой волшебной пыли, которую вы можете посыпать своим приложением Twisted, которое сделает его быстрее.Если вы выберете часть своего кода, которая не очень интенсивна и не требует блокировки ресурсов, таких как процессор или диск, то вы обнаружите, что накладные расходы на перенос работы в другой процесс могут перевесить любую выгоду от ее наличия.

1 голос
/ 16 декабря 2010

Вы не должны использовать темы для этого. Делать все это в потоке реактора нормально. Если ваш скребок использует twisted.web.client для доступа к сети, он не должен блокироваться, поэтому вы будете работать так быстро, как только сможете.

0 голосов
/ 16 декабря 2010

Во-первых, остерегайтесь того, что реактор Twisted иногда многопоточен и назначает задачи, ничего вам не сказав. Конечно, я не видел вашей программы в частности.

Во-вторых, в Python (то есть в CPython) порождение потоков для выполнения неблокирующих вычислений имеет мало преимуществ. Читайте о GIL (Глобальная блокировка интерпретатора) .

...