我通過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()
聽起來像一個XY問題。爲什麼你首先使用線程? –
嗨丹尼爾,我不知道什麼是XY問題。您能否分享更多信息?我在這裏使用多線程的原因只是爲了儘快響應客戶端,以便它不會被數據庫操作阻塞。 @DanielRoseman – fehu
http://xyproblem.info/ - 即你不問你的實際問題。正如你發現的那樣,手動管理線程在你不管理的環境中很少是一個好主意。使用離線工作者系統,如[芹菜](http://www.celeryproject.org/)。 –