UwsgiはPythonでグローバル変数を取得できません

uwsgiを使用してPythonスクリプトまたはプロジェクトを開始すると、グローバル変数にアクセスできないという問題が発生します。

uwsgiが子プロセスの数を指定できることは誰もが知っています。プロセス数を1に設定すると、2つの関数があるため、彼は1つだけを処理します(同時に)。uwsgiはスレッドの同時実行性のために複数のプロセスを独立して実行するため、複数のグローバル変数があります。

  • uwsgiが機能する方法は、指定されたプロセスのリスニングポートを開始し、要求が受信されたときに対応するuwsgiエントリファイルを実行して、結果を指定されたリスニングポートに返します。

  • Pythonまたは変数にアクセスする複数のスレッドでグローバル変数を変更する場合、グローバル変数を変更することはできません。
    リクエストごとにPythonスクリプトが再実行されるため、毎回グローバル変数が再初期化されるからです。

解決策

プロセスにグローバル変数を配置することはお勧めできません。それらを取り出して「パブリックアクセスエリア」に配置し、すべてのプロセスが「パブリックアクセスエリア」のグローバル変数にアクセスして変更できるようにします。

  • 現在、この「パブリックアクセスエリア」は複数の方法で実装できます。
  1. 既製のデータベースを使用:redis、mongodb、mysqlなど。

  2. データを自分で管理するための管理プロセスを実装します(マルチプロセッシングモジュールを参照)。

  3. 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_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

元の記事を132件公開 263 件を賞賛 130,000回閲覧

おすすめ

転載: blog.csdn.net/weixin_44685869/article/details/105669196