je la demande suivante qui exécute un programmateur pour mettre à jour périodiquement l'état d'une variable globale (dict):Mise à jour un dictionnaire global à partir de plusieurs threads
from sanic import Sanic
from sanic.response import text
from apscheduler.schedulers.background import BackgroundScheduler
import bumper
app = Sanic()
scheduler = BackgroundScheduler()
inventory = {1: 1, 2: 2}
@scheduler.scheduled_job('interval', seconds=5)
def bump():
bumper.bump()
@scheduler.scheduled_job('interval', seconds=10)
def manual_bump():
global inventory
inventory[2] += 1
@app.route("/")
async def test(request):
return text(inventory)
if __name__ == "__main__":
scheduler.start()
app.run(host="0.0.0.0", port=8000)
La fonction importée dans le 5 deuxième emploi intervalle est dans un fichier différent dans le même répertoire:
from app import inventory
def bump_inventory():
inventory[1] += 1
print('new', inventory)
Cela ne fonctionne cependant pas comme je l'avais espéré. La fonction importée met à jour l'inventaire mais la modification n'est jamais propagée dans le dictionnaire d'origine. Par conséquent, bump_inventory
fonctionne sur une copie de inventory
ou ne la met jamais à jour en dehors de la portée de la fonction. Dans deux terminaux différents:
]$ python app.py
2017-02-19 14:11:45,643: INFO: Goin' Fast @ http://0.0.0.0:8000
2017-02-19 14:11:45,644: INFO: Starting worker [26053]
new {1: 2, 2: 2}
new {1: 3, 2: 2}
]$ while true; do curl http://0.0.0.0:8000/; echo; sleep 1; done
{1: 1, 2: 2}
...
{1: 1, 2: 3}
...
Quelle est la bonne façon de procéder?
Merci! Je suis encore relativement nouveau dans le domaine de l'asyncose, donc c'est une information très utile. La raison pour laquelle je veux avoir l'état global est de ne pas déranger avec une base de données et de garder tout en mémoire. Une base de données SQLite en mémoire est également une option, mais les données de l'inventaire sont très simples (parfaites pour un dict simple thread-safe), donc cela semble exagéré. Quel est l'avantage de maintenir l'état global dans 'app' plutôt que comme une variable séparée? – mart1n
En outre, toute supposition quand une version qui comprend 'add_task' sera disponible dans PyPI? – mart1n