2011-12-20 5 views
4

Я создаю приложение django, которое зависит от модуля python, в котором реализован обработчик сигнала SIGINT.Python: Django: обработчик сигналов и основной поток

Предполагая, что я не могу изменить модуль, от которого я зависим, как я могу обойти ошибку «сигнал работает только в основной теме». Я интегрирую его в Django?

Могу ли я запустить его на основной теме Django? Есть ли способ заблокировать обработчик, чтобы позволить модулю работать на не основных потоках?

Спасибо!

+0

У меня такая же проблема. Странная часть заключается в том, что я уверен, что я не использую ни одного потока. Я просто запускаю manage.py runningerver. –

ответ

0

Хотя вопрос не точно описать ситуацию, когда вы находитесь в, вот некоторые более общие рекомендации:

сигнал посылается только в основной поток. По этой причине обработчик сигнала должен находиться в основном потоке. С этого момента действие, которое срабатывает сигнал, должно быть передано другим потокам. Обычно я делаю это с помощью Events. Обработчик сигналов устанавливает событие, которое будут читать другие потоки, и затем поймет, что действие X было вызвано. Очевидно, это означает, что атрибут события должен быть разделен между потоками.

2

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

python manage.py runserver --noreload 

Вы также должны помнить об этом при выборе установки производства. По крайней мере некоторые из вариантов развертывания (например, threaded fastcgi) наверняка будут выполнять ваш код вне основного потока.

1

Я использую Python 3.5 и Django 1.8.5 с моим проектом, и недавно я встретил аналогичную проблему. Я могу легко запустить свой код xxx.py с SIGNAL напрямую, но он не может быть выполнен на Django в виде пакета только из-за ошибки «сигнал работает только в основной теме».

Во-первых, работает сервер с --noreload --nothreading, но для меня это слишком мало меняет код многопоточности.

Во-вторых, я обнаружил, что код в __init__.py моего пакета работает в основной теме. Но, конечно, только основной поток может поймать этот сигнал , мой код в пакете не может его поймать. Он не может решить мою проблему, хотя это может быть для вас решением.

Наконец-то я обнаружил, что в Python есть встроенный модуль с именем subprocess. Это означает, что вы можете запустить суб-полноценный процесс с ним, то есть этот процесс имеет свой собственный основной поток, поэтому вы можете легко запустить свой код с SIGNAL здесь. Хотя я не знаю производительность с ее использованием, она работает хорошо для меня. PS, вы можете найти все подробности о subprocess в документации на Python.

Спасибо ~

Смежные вопросы