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:
-
Utilice bases de datos listas para usar: redis, mongodb, mysql, etc.
-
Implemente un proceso de administración para administrar los datos usted mismo (consulte el módulo de multiprocesamiento);
-
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 uwsgi
un 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
uwsgi
añ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 mycache
caché, tiene hasta 100 entradas, cada entrada es el mayor de: 5 MB, que blocksize
se utiliza para establecer el tamaño de una sola memoria intermedia, en bytes (byte)
Añadir buena uwsgi
caché lata después de python
establecer las necesidades variables de acceso público a la secuencia de comandos, mediante la introducción del uwsgi
método llama al siguiente módulo y se puede utilizar uwsgi
la 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é API
de 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 ypurge_lru
tiempo, elimina de la caché del tesoro, véase más adelante) -
cache
El parámetro es el llamado "identificador mágico", y su sintaxis escache[@node]
El método de configuración específico puede referirse a:
Además, se recomienda el uso de uwsgi_cache
este módulo, el cual utiliza python
su propio pickle
módulo uwsgi
en cache api
un paquete simple que uwsgi
se puede almacenar en caché python
los objetos, es la necesidad de cuidado de usar que la memoria caché pickle
de objetos no soporta este tipo de python
módulos o archivos abiertos, etc., no están aquí para explicar las razones específicas, puede referirse al python pickle
módulo de esta entrada del blog.
uwsgi_cache
Este módulo en sí ofrece dos métodos, el contenido específico puede referirse a la uwsgi_cache
página de inicio
- Utilice
uwsgi_cache
módulo de memoria caché completa: En primer lugar configurar la caché:
uwsgi test.py --cache2 name=api,items=1000
A continuación, test.py
llamar al archivo uwsgi
de caché api
caché 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