2016-11-14 59 views
1

私はDjango + uWSGIによってWebサーバーを作成しました。基本的な流れは次のとおりです。要求が受け取られると、DjangoはPythonのビルドインlibでサブスレッドを開始し、dbを非同期に書き込むために「スレッド化」し、メインスレッドではすぐにクライアントに応答します。djangoサブスレッドがuWSGI respawnによって殺されるのを避けるには

どのようにして、uWSGIは時にはワーカープロセスを再生成します(プロセスによって要求が処理されない場合もあります)。バックグラウンドサブスレッドはまだ終了していなくても終了します。 uWSGIが実行中のサブスレッドを持つワーカープロセスを再生成しないようにする手掛かりはありますか?

uWSGIの復活・ログ:

DAMN ! worker 4 (pid: 31161) died, killed by signal 9 :(trying respawn ... 

uWSGI INI設定(バージョン2.0.12):

[uwsgi] 
# Django's wsgi file 
wsgi-file = /home/fh/dj_uwsgi/dj_site/dj_site/wsgi.py  
master  = true 
processes = 10 
http  = :8001 
threads = 2 
enable-threads = true 
http-timeout = 10  
max-requests = 5000   
chmod-socket = 664 
vacuum  = true  
pidfile = /home/fh/dj_uwsgi/dj_site/uwsgi.pid 
daemonize = /home/fh/log/uwsgi_dj.log 

ジャンゴ(バージョン1.8)アプリの擬似コード:handlers.pyで

import threading 

class SubThreadClass(threading.Thread): 
    daemon = True 

    def run(self): 
     # actions to write db 

def myHandler(): 
    my_sub_thread = SubThreadClass() 
    my_sub_thread.start() 

in views.py :

from handlers import myHandler 

def url_handler(request): 
    myHandler() 
    return HttpResponse() 
+0

XYの問題のようです。なぜ最初にスレッドを使用していますか? –

+0

こんにちはダニエル、私はXYの問題は何か分かりません。もっと情報を共有してもらえますか?ここでマルチスレッドを使用するのは、できるだけ早くクライアントに応答して、db操作でブロックされないようにするためです。 @DanielRoseman – fehu

+0

http://xyproblem.info/ - つまり、あなたの実際の問題については質問していません。あなたが発見したように、管理していない環境でスレッドを手動で管理することはまれです。 [Celery](http://www.celeryproject.org/)のようなオフラインワーカーシステムを使用してください。 –

答えて

1

スレッドを手動で処理することは、管理していない環境ではあまりお勧めできません。

Celeryのようなオフラインワーカーシステムを使用する必要があります。

0

私のケースでは、この問題はデータベースでの特定の操作の遅延のために発生しました。

私はピラミッドhttp://docs.pylonsproject.org/projects/pyramid/en/latest/)とuWSGIを使用しています。あなたがDjango(Python)を使用しているので、それはあなたにとって解決策である可能性が非常に高いです。以下に引用

設定は、コンフィギュレーションファイルにproduction.ini(セクション[uwsgi])(http://uwsgi-docs.readthedocs.io/en/latest/Options.html)です。

私はこの問題を以下のルールを使って "解決"しました。それは、問題の発生を大幅に減らすため、問題を「解決」します。これまで私はそれを完全に避けることは何も見ていない。パフォーマンスも向上しました(テストが必要ですが、改善が見られました)。解決策は基本的に、データベースの接続数に応じてスレッド数を増やしています(データベースで許可されている接続数を増やすこともできます)。

ルール:

あなたproduction.ini内のスレッド'S数量(スレッドパラメータを定義するにはPROCESSES'S数量(あなたproduction.iniまたは同等でプロセスパラメータ)

q=n*2 

q - number of processes 
n - number of CPUs/cores 

を定義するには、または同等物)

t=(p*0.8)/q 

t - number of threads 
p - number of connections available in your database 
q - number of processes 

sqlalchemyにも注意してください。pool_sizeパラメータ(sqlalchemyを使用する場合はhttp://www.sqlalchemy.org/)にはtと同じ値を指定する必要があります。

プラス:

それらが再起動されたときに[uwsgi]セクションで、「レイジーアプリを= true」をパラメータを追加「ロック」原因同時にあなたのproduction.iniにアクセスするPythonのプロセスを防ぐために。 これは、システムに問題が発生した場合にのみ実行してください。

関連する問題