2017-05-17 3 views
0

Je travaille sur un cadre de flacon essayant de programmer un travail qui sera déclenché dans 30 minutes du déjeuner et se produira seulement une fois.Comment planifier des événements temporisés dans Python Flask?

J'ai essayé de travailler avec threading.Timer, mais depuis mon travail appelle une demande REST Je reçois RuntimeError: « travailler en dehors du contexte de la demande » que je ne pouvais pas résoudre.

A partir de ce fil, je comprends qu'il ne soit pas recommandé d'utiliser le module de filetage sur un serveur flacon: How do you schedule timed events in Flask?

Je suis à la recherche d'une solution pour un travail de déclenchement chronométré (qui ne fonctionne pas intervalles).

Il semble que APscheduler doive être basé sur des intervalles.

Je serais reconnaissant pour toute aide.

+1

Essayez d'utiliser 'Celery'. – stamaimer

+0

Hé, Je pense que mon problème est peut-être différent, car engendrer un nouveau thread sans minuteur conduit également au même RunTimeError. Il semble que lorsqu'un nouveau thread est créé, il n'obtient pas un contexte d'application ou un contexte de requête. J'ai réussi à transmettre le contexte de l'application en tant que paramètre au nouveau thread; Cependant, il n'y a toujours pas de contexte de requête, et l'exception est levée quand il tente d'atteindre une requête. Est-il possible de générer une requête, ou devrais-je la transmettre également? Merci :) – Lito26

+0

http://flask.pocoo.org/docs/0.12/patterns/celery/ – stamaimer

Répondre

1

La méthode apscheduler add_job peut prendre un déclencheur date qui vous permettra de faire ce que vous voulez.

Conseils Pro:

Si vous utilisez apscheduler dans votre processus d'application de flacon, en entrant dans la production avec un serveur wsgi comme gunicorn ou uwsgi vous remettre avec votre travail en cours du temps l'exécution multiple (un pour chaque travailleur de la fiole).

En face de ce problème, l'option gunicorn --preload ne l'a pas coupé pour moi.

Alors:

  • Vous pouvez utiliser flacon-apscheduler avec son approche serveur de repos si cela vous convient.
  • Ou séparer le apscheduler en un démon et
    • utilisation uwsgi mules,
    • ou garder gunicorn en cours d'exécution que l'application Web et d'utiliser superviseur pour commencer le démon du planificateur.
    • ou utiliser la solution this avec une prise qui est un peu sale mais qui a l'avantage d'être simple.

IMHO la séparation des gunicorn/flacon et apscheduler en deux parties et l'utilisation du superviseur est le plus propre encore pas la solution si complexe.