uwsgiを使用してPythonスクリプトまたはプロジェクトを開始すると、グローバル変数にアクセスできないという問題が発生します。
uwsgiが子プロセスの数を指定できることは誰もが知っています。プロセス数を1に設定すると、2つの関数があるため、彼は1つだけを処理します(同時に)。uwsgiはスレッドの同時実行性のために複数のプロセスを独立して実行するため、複数のグローバル変数があります。
-
uwsgiが機能する方法は、指定されたプロセスのリスニングポートを開始し、要求が受信されたときに対応するuwsgiエントリファイルを実行して、結果を指定されたリスニングポートに返します。
-
Pythonまたは変数にアクセスする複数のスレッドでグローバル変数を変更する場合、グローバル変数を変更することはできません。
リクエストごとにPythonスクリプトが再実行されるため、毎回グローバル変数が再初期化されるからです。
解決策
プロセスにグローバル変数を配置することはお勧めできません。それらを取り出して「パブリックアクセスエリア」に配置し、すべてのプロセスが「パブリックアクセスエリア」のグローバル変数にアクセスして変更できるようにします。
- 現在、この「パブリックアクセスエリア」は複数の方法で実装できます。
-
既製のデータベースを使用:redis、mongodb、mysqlなど。
-
データを自分で管理するための管理プロセスを実装します(マルチプロセッシングモジュールを参照)。
-
uwsgiの組み込みキャッシュ機能を利用する
ここで、あなたは、サードパーティ製のツールに依存しない最大化することができる第三の解決策にとにより焦点を当てているuwsgi
組み込みの方法。
关于“新一代”的缓存,它由uWSGI 1.9引入。 对于旧式缓存 (现在简单称其为“web缓存”),可以看看 WebCaching框架
uWSGI包含了一个非常快速、全内存访问、零IPC、SMP安全、不断优化、高度可调的、键值存储的简单的“缓存框架”。
单个uWSGI实例可以使用不同的设置,出于不同的目的,创建无限个不同的“缓存”。
- 次のコマンドで開始します
uwsgi
。
uwsgi --cache2 name=mycache,items=100 --socket :3031
これにより、という名前の”mycache”
キャッシュが作成され、最大100項目が含まれます。各アイテムは64kまで可能です。
- または
uwsgi
、以下の構成プロファイルを追加します(最初の行はコメントの記述です)
; create a cache with 100 items (default size per-item is 64k)
cache2 = name=mycache,items=100,blocksize=5000000
構成という名前作成しmycache
、各エントリは最大であり、それは100件のエントリまで持つ、キャッシュ:5メガバイト、blocksize
バイト単位で、単一のバッファのサイズを設定するために使用されている(バイト)
良い追加uwsgi
した後、缶キャッシュをpython
導入することで、スクリプトへのパブリックアクセスの変数ニーズを設定するuwsgi
方法以下のモジュールを呼び出して使用することができますuwsgi
キャッシュを。
-
cache_get(key [、cache])
-
cache_set(key、value [、expires、cache])
-
cache_update(key、value [、expires、cache])
-
cache_exists(key [、cache])
-
cache_del(キー[、キャッシュ])
-
cache_clear([キャッシュ])
あなたはキャッシュを呼び出した場合API
(たとえば、文字列とバイト間の言語/プラットフォームの区別のをPython 3和Java
)、あなたはキーが文字列、バイト値である(またはJavaの下で、バイトの配列である)ことを前提としなければなりません。それ以外の場合、内部的にはキャッシュ値とキャッシュキーは単純なバイナリBLOBであるため、キーと値は特定のエンコードのない文字列です。
-
expires
パラメータ(デフォルトは無効、0である)オブジェクトは(提供されない場合に、秒を失敗したpurge_lru
時、キャッシュスカベンジャーから取り外し、下記を参照してください) -
cache
パラメータはいわゆる「マジック識別子」であり、その構文はcache[@node]
特定の構成方法は、以下を参照できます。
-
uWSGIキャッシュクッキングガイド:https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/CachingCookbook.html
-
uWSGIキャッシングフレームワークhttps://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Caching.html
また、使用することをお勧めしuwsgi_cache
利用した、このモジュールをpython
独自のpickle
モジュールをuwsgi
してcache api
、簡単なパッケージuwsgi
キャッシュすることができpython
、オブジェクトをキャッシュすることを注意して使用する必要があるpickle
オブジェクトは、そのようなサポートされていないpython
モジュールをか開いているファイルなど、特定の理由を説明するためにここではありませんを参照することができpython pickle
、このブログの記事モジュール。
uwsgi_cache
このモジュール自体は2つのメソッドを提供し、具体的な内容は、参照することができuwsgi_cache
ホーム・ページ
- 使用
uwsgi_cache
モジュールの完全なキャッシュ:まずキャッシュを設定します。
uwsgi test.py --cache2 name=api,items=1000
次に、test.py
ファイルを呼び出すuwsgi
キャッシュapi
グローバルキャッシュ
from uwsgi_cache.cache import CacheManager
# :params:
# name: the name of the cache that you would like to create
# expires: the expire time of the cache data
# 这里需要传入两个参数 ,name 为缓存的名字,
# expires 为缓存的有效期, 0 表示禁用(即该缓存永不失效)
cache = CacheManager("cache_name_01", 0)
# 调用缓存方法
cache = 0
if not cache.exists("count"):
cache.set("count",0)
print("count value is %d",0)
else:
count = cache.get("count")
count +=1
print("count value is %d",count)
cache.set("count",count)
def application(environ, start_response):
status = '200 OK'
response_body = "count value is %d",count
response_header = [('Content-Type', 'text/html')]
start_response(status, response_header)
return [response_body.encode()]
uwsgiを起動します。countの値は、要求を呼び出すたびに増加し続けることがわかります。
uwsgi test.py --cache2 name=api,items=1000
参照元のアドレス:https : //my.oschina.net/ghimi/blog/2705982