2011-12-20 28 views
4

私は、SIGINTシグナルハンドラが実装されているPythonモジュールに依存するdjangoアプリケーションを構築しています。Python:Django:シグナルハンドラとメインスレッド

私が依存しているモジュールを変更できないとすれば、どうすれば "シグナルがメインスレッドでのみ動作する"というエラーを回避できますか?エラーをDjangoに統合しますか?

Djangoメインスレッドで実行できますか? モジュールが非メインスレッドで実行できるようにハンドラを禁止する方法はありますか?

ありがとうございます!

+0

私は同じ問題があります。奇妙な部分は、私はかなりスレッドを使用していないと確信しているということです。私はmanage.py runserverを実行しています。 –

答えて

0

質問はあなたがしている正確に状況を説明していませんが、ここではいくつかのより一般的なアドバイスです:

信号のみメインスレッドに送信されます。このため、シグナルハンドラはメインスレッドに存在する必要があります。 その時点で、シグナルがトリガーするアクションを他のスレッドに伝える必要があります。私は通常Eventsを使ってこれを行います。シグナルハンドラは他のスレッドが読み込むイベントを設定し、アクションXがトリガされたことを認識します。明らかに、これはイベント属性がスレッド間で共有されるべきであることを意味します。

2

Djangoに組み込まれている開発サーバーには、デフォルトで有効になっている自動リロード機能があり、コードをリロードする手段として新しいスレッドを生成します。このあなたは明らかに自動リロードの利便性を失うと思いますが、あなたは、単に、次の操作を行うことができます回避するには:

python manage.py runserver --noreload 

また、あなたの生産のセットアップを選択する際に、このに留意する必要があります。少なくともいくつかのデプロイメントオプション(スレッド化されたfastcgiなど)は、メインスレッドの外側でコードを実行することが確実です。

1

私のプロジェクトではPython 3.5とDjango 1.8.5を使用していましたが、最近同様の問題が発生しました。 SIGNALで直接xxx.pyコードを実行することは簡単ですが、「シグナルはメインスレッドでしか動作しません」というエラーのため、Djangoでパッケージとして実行することはできません。

まず、--noreload --nothreadingでrunserverを使用することはできますが、私のために遅すぎるマルチスレッドコードを実行します。

第2に、私のパッケージの__init__.pyのコードがメインスレッドで実行されていました。しかし、もちろん、メインスレッドだけがシグナルを捕まえることができますが、私のコードはそれをまったくキャッチできません。それは私の問題を解決することはできませんが、それはあなたのための解決策かもしれません。

最後に、Pythonにsubprocessという名前の組み込みモジュールがあることがわかりました。つまり、このプロセスには独自のメインスレッドがあるので、コードをSIGNALで簡単に実行することができます。私はそれを使用してパフォーマンスを知っていませんが、それは私のためにうまく動作します。 PSでは、subprocessに関するすべての詳細をPython Documentationで見つけることができます。

ありがとう〜

関連する問題