2016-11-14 32 views
1

我通過Django + uWSGI創建了一個web服務器。基本流程是:當接收到請求時,Django將通過python內置庫「Threading」啓動一個子線程來異步編寫db,並在主線程中立即迴應客戶端。如果uWSGI有時會重新創建工作進程(也許沒有進程請求處理?),這導致後臺子線程即使尚未完成也會被終止。有什麼線索可以避免uWSGI不要重新生成一個具有運行子線程的工作進程?如何避免Django子線程被uWSGI殺死respawn

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 

的Django(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問題。您能否分享更多信息?我在這裏使用多線程的原因只是爲了儘快響應客戶端,以便它不會被數據庫操作阻塞。 @DanielRoseman – fehu

+0

http://xyproblem.info/ - 即你不問你的實際問題。正如你發現的那樣,手動管理線程在你不管理的環境中很少是一個好主意。使用離線工作者系統,如[芹菜](http://www.celeryproject.org/)。 –

回答

1

手動處理線程在您不管理的環境中很少是個好主意。

您應該使用脫機工作系統,如Celery

0

在我的情況下,這個問題是由於我的數據庫的某些操作的延遲造成的。

我用uWSGI金字塔http://docs.pylonsproject.org/projects/pyramid/en/latest/)。由於您使用的是Django(Python),因此該解決方案很可能適用於您。

下文引用的設置是在配置文件production.ini(部分[uwsgi])(http://uwsgi-docs.readthedocs.io/en/latest/Options.html)英寸

我用下面的規則「解決」了這個問題。這個規則「解決」了問題,因爲它大大減少了它的發生。到目前爲止,我還沒有看到任何可以完全避免的東西。我的表現也有所提高(需要測試,但我們評估爲一項很好的改進)。該解決方案基本上增加了線程的數量,具體取決於數據庫允許的連接數(您還可以增加數據庫允許的連接數)。

規則:

定義流程'S量(過程參數在production.ini或同等學歷)

q=n*2 

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

TO DEFINE THREADS'S量(線程參數在production.ini或等同物)

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相同的值。

加:

要防止的Python程序同時訪問您的production.ini他們正在重新啓動導致「鎖定」添加「懶惰應用=真」在[uwsgi]部分參數時。 只有當您的系統開始有問題時才這樣做。