Je connais bien la programmation événementielle mais j'ai rencontré ce problème et j'ai mis fin à des solutions possibles. J'ai lu la documentation de Tornado, j'ai essayé avec:Exécution de tâches asynchrones à l'aide du framework Web Tornado
- Futures
- gen.coroutine
- asynchrone
- add_timeout
mais je n'ai pas pu résoudre le problème suivant:
J'ai un serveur websocket qui vient écouter les nouveaux messages et en fonction du type de message, il appelle une fonction
WebSocketHandler classe (tornado.websocket.WebSocketHandler) spécifique:
... def on_message(self, message): if message['type'] is X: self.write(functionA(message['data'])) elif message['type'] is Y: self.write(functionB(message['data'])) ...
Le problème vient quand une fonction coûteuse informatiquement est exécuter, laisser dire fonctionn, il peut prendre jusqu'à 5 minutes pour mettre fin à
def functionA(message):
params = extract_params(message)
cmd = "computationally_expensive_tool"
out = check_output(cmd, shell=True, stderr=STDOUT, cwd=working_dir)
...
return json.dumps({
"error": False,
"message": "computationally_expensive_tool_execution_terminated",
"type": X
})
Ma question est de savoir comment puis-je exécuter ce functio n d'une manière asynchrone afin que je puisse encore gérer d'autres messages et le résultat de la fonction A quand il sera prêt?
Pourriez-vous donner un exemple de vos fonctions? –
Salut @ notorious.no, merci de votre intérêt. J'ai ajouté quelques détails sur la fonctionA et l'objectif que je veux atteindre. Donc functionA appelle cet outil et quand il finit, je veux pouvoir le notifier au client en lui envoyant un message. – MrGoodKat