我正在構建一個Django應用程序,它依賴於已經實現了SIGINT信號處理程序的python模塊。Python:Django:信號處理程序和主線程
假設我不能改變我所依賴的模塊,我該如何解決「信號只在主線程中工作」的錯誤我把它集成在Django中?
我可以在Django主線程上運行它嗎? 有沒有辦法阻止處理程序允許模塊在非主線程上運行?
謝謝!
我正在構建一個Django應用程序,它依賴於已經實現了SIGINT信號處理程序的python模塊。Python:Django:信號處理程序和主線程
假設我不能改變我所依賴的模塊,我該如何解決「信號只在主線程中工作」的錯誤我把它集成在Django中?
我可以在Django主線程上運行它嗎? 有沒有辦法阻止處理程序允許模塊在非主線程上運行?
謝謝!
雖然問題並不確切地描述你的情況,這裏是一些比較通用的建議:
的信號只發送到主線程。出於這個原因,信號處理程序應該在主線程中。 從那時起,信號觸發的動作需要傳送給其他線程。我通常使用Events來做這件事。信號處理程序設置事件,其他線程將讀取該事件,然後意識到動作X已被觸發。顯然這意味着應該在線程之間共享事件屬性。
Django的內置開發服務器具有默認啓用的自動重新加載功能,它產生一個新線程作爲重新加載代碼的手段。要解決這一點,你可以簡單地做到以下幾點,雖然你會明顯失去自動重載的方便:
python manage.py runserver --noreload
您還需要選擇你的產品設置時要留意這一點。至少有一些部署選項(如線程化fastcgi)肯定會在主線程之外執行您的代碼。
我用Python 3.5和Django 1.8.5與我的項目,我最近遇到了類似的問題。我可以直接運行我的xxx.py
代碼,信號,但它不能在Django上作爲一個包僅僅因爲「信號只在主線程中有效」才能執行。
首先,與--noreload --nothreading
運行服務器是可用的,但它運行我的多線程代碼對我來說太慢了。
其次,我發現我的包的__init__.py
中的代碼在主線程中運行。但是,當然,只有主線程可以捕捉到這個信號,我的包中的代碼根本無法捕捉它。它不能解決我的問題,但它可能是您的解決方案。
最後,我發現Python中有一個名爲subprocess
的內置模塊。這意味着你可以用它運行一個完整的子過程,也就是說,這個過程有它自己的主線程,所以你可以很容易地在這裏運行你的代碼SIGNAL。雖然我不知道使用它的表現,但它對我來說效果很好。 PS,你可以在Python文檔中找到關於subprocess
的所有細節。
謝謝〜
我有同樣的問題。奇怪的是我很確定我沒有使用任何線程。我只是運行manage.py runserver。 – 2012-03-15 22:28:52