私は多くの時間を無駄にしましたが、解決策を見つけることができませんでした。
uwsgiでデプロイされたアプリでスレッドを使用すると、スレッドが同期されません。
ここに例(wsgi.py)の簡単なコードがあります:
from time import sleep
import threading
i = 0
def daemon():
global i
while True:
i += 1
print(i)
sleep(3)
th = threading.Thread(target=daemon, args=())
th.start()
def application(environ, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [str(i).encode()]
そして、このアプリを実行i
するとログが増加しますが、1
ブラウザーからのmakeリクエスト時に常に取得します(または最初のインクリメントの前0
に移動した場合は取得します)uwsgi.threadデコレーターを試しましたが、同じ結果が得られました。sleep(3)
i
uwsgi config:
[uwsgi]
socket = 127.0.0.1:3034
plugins-dir = /srv/uwsgi
plugin = python34
uid = py3utils
gid = py3utils
chdir = /srv/python/3/py3utils/tht/app/
wsgi-file = wsgi.py
enable-threads = true
daemonize = %(chdir)/../uwsgi.log
master = true
die-on-term = true
touch-reload = ../uwsgi_restart.txt
*英語でごめんなさい
これは、アプリケーションをインポートした後、マスタープロセスがワーカーにフォークするために発生します。
spawned uWSGI master process (pid: 7167)
spawned uWSGI worker 1 (pid: 7169, cores: 1)
spawned uWSGI http 1 (pid: 7170)
したがって、印刷するスレッドi
はマスタープロセスで実行されており、リクエストはワーカーによって処理されます。フォーク中のワーカーはi
1に等しいと見なします。sleep
インクリメントする前に移動するとi
、プロセスは最初のインクリメントの前にフォークすることができます。
次のようなものを使用する必要がありますuwsgidecorators.thread
:
from time import sleep
import threading
import uwsgidecorators
i = 0
@uwsgidecorators.postfork
@uwsgidecorators.thread
def daemon():
global i
while True:
i += 1
print(i)
sleep(3)
def application(environ, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [str(i).encode()]
メインスレッド以外のスレッドは、フォーク中にコピーされません。
または使用:
[uwsgi]
master = false
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加