Uwsgi no puede obtener variables globales en Python

Al usar uwsgi para iniciar un script o proyecto Python, habrá un problema al que no se puede acceder a las variables globales.

Todo el mundo sabe que uwsgi puede especificar el número de procesos secundarios. Establezco el número de procesos en 1, luego tengo dos funciones, por lo que solo manejará una (al mismo tiempo). uwsgi ejecuta múltiples procesos independientemente para la concurrencia de subprocesos, por lo que tiene múltiples variables globales.

  • La forma en que funciona uwsgi es iniciar un puerto de escucha de proceso específico, ejecutar el archivo de entrada uwsgi correspondiente al recibir la solicitud y luego devolver el resultado al puerto de escucha especificado.

  • Cuando se trata de modificar variables globales en una python o múltiples subprocesos que acceden a una variable, no podrá obtener la modificación de las variables globales.
    Debido a que cada solicitud volverá a ejecutar el script de Python nuevamente, de modo que cada vez reinicializará las variables globales.

Solución

No es aconsejable colocar variables globales en un proceso, así que sáquelas y colóquelas en un "área de acceso público" para permitir que todos los procesos accedan y modifiquen las variables globales del "área de acceso público".

  • En la actualidad, esta "área de acceso público" se puede implementar de múltiples maneras:
  1. Utilice bases de datos listas para usar: redis, mongodb, mysql, etc.

  2. Implemente un proceso de administración para administrar los datos usted mismo (consulte el módulo de multiprocesamiento);

  3. Aproveche la función de caché incorporada de uwsgi

Aquí que se centró en la manera de resolver la tercera, puede maximizar no se basa en las herramientas de terceros, y por medio de uwsgiun método integrado.

关于“新一代”的缓存,它由uWSGI 1.9引入。 对于旧式缓存 (现在简单称其为“web缓存”),可以看看 WebCaching框架
uWSGI包含了一个非常快速、全内存访问、零IPC、SMP安全、不断优化、高度可调的、键值存储的简单的“缓存框架”。
单个uWSGI实例可以使用不同的设置,出于不同的目的,创建无限个不同的“缓存”。
  • Comience con el siguiente comando uwsgi:
uwsgi --cache2 name=mycache,items=100 --socket :3031

Esto creará un ”mycache”caché llamado , que tiene hasta 100 elementos. Cada artículo puede tener hasta 64k.

  • O uwsgiañadir el siguiente perfil de configuración (la primera línea es una descripción comentario)
; create a cache with 100 items (default size per-item is 64k)
cache2 = name=mycache,items=100,blocksize=5000000

Configuración crea una llamada mycachecaché, tiene hasta 100 entradas, cada entrada es el mayor de: 5 MB, que blocksizese utiliza para establecer el tamaño de una sola memoria intermedia, en bytes (byte)

Añadir buena uwsgicaché lata después de pythonestablecer las necesidades variables de acceso público a la secuencia de comandos, mediante la introducción del uwsgimétodo llama al siguiente módulo y se puede utilizar uwsgila caché.

  • caché_get (clave [, caché])

  • conjunto_caché (clave, valor [, caduca, caché])

  • cache_update (clave, valor [, caduca, caché])

  • cache_exists (clave [, caché])

  • cache_del (clave [, caché])

  • cache_clear ([caché])

Si llama a la caché APIde distingue el lenguaje / plataforma entre cadenas y bytes (por ejemplo Python 3和Java), entonces usted debe asumir que la clave es una cadena, valor de byte (o bajo java, es una matriz de bytes). De lo contrario, las claves y los valores son cadenas sin codificación específica, porque internamente, los valores de caché y las claves de caché son simples blobs binarios.

  • expires(Parámetros por defecto es 0, desactiva) el objeto se falla segundos (cuando no la proporcione y purge_lrutiempo, elimina de la caché del tesoro, véase más adelante)

  • cache El parámetro es el llamado "identificador mágico", y su sintaxis es cache[@node]

El método de configuración específico puede referirse a:

Además, se recomienda el uso de uwsgi_cacheeste módulo, el cual utiliza pythonsu propio picklemódulo uwsgien cache apiun paquete simple que uwsgise puede almacenar en caché pythonlos objetos, es la necesidad de cuidado de usar que la memoria caché picklede objetos no soporta este tipo de pythonmódulos o archivos abiertos, etc., no están aquí para explicar las razones específicas, puede referirse al python picklemódulo de esta entrada del blog.

uwsgi_cacheEste módulo en sí ofrece dos métodos, el contenido específico puede referirse a la uwsgi_cachepágina de inicio

  • Utilice uwsgi_cachemódulo de memoria caché completa: En primer lugar configurar la caché:
uwsgi test.py --cache2 name=api,items=1000

A continuación, test.pyllamar al archivo uwsgide caché apicaché a nivel mundial

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()]

Inicie uwsgi, encontrará que el valor del recuento seguirá aumentando con cada llamada de solicitud.

uwsgi test.py --cache2 name=api,items=1000

Dirección original de referencia: https://my.oschina.net/ghimi/blog/2705982

Publicado 132 artículos originales · elogiado 263 · 130,000 visitas

Supongo que te gusta

Origin blog.csdn.net/weixin_44685869/article/details/105669196
Recomendado
Clasificación