Errno 9 en utilisant le module multiprocesseur avec Tornado dans le python
-
28-09-2019 - |
Question
Pour les opérations de mon serveur Tornado qui devraient bloc (et ne peut pas être facilement modifié pour utiliser des choses comme client de requête HTTP asynchrone de Tornado), je suis déchargeant le travail à des processus de travail séparés à l'aide du module multiprocessing
. Plus précisément, je travaillais avec un Pool
multitraitement car il offre une méthode appelée apply_async
, qui fonctionne très bien avec Tornado, car il faut un rappel que l'un de ses arguments.
J'ai récemment réalisé qu'une piscine préalloue le nombre de processus, de sorte que si tous se bloquer, les opérations qui nécessitent un nouveau processus devra attendre. Je me rends bien compte que le serveur peut encore prendre des connexions depuis les travaux de apply_async
en ajoutant des choses à une file d'attente de tâches, et est plutôt terminé immédiatement, lui-même, mais je suis à la recherche de spawn n processus pour n quantité de tâches bloquantes doivent effectuer.
Je me suis dit que je pouvais utiliser la méthode
La solution add_handler prend un descripteur de fichier valide, pas un PID. À titre d'exemple de ce qui est attendu, une tornade utilise elle-même add_handler normalement en passant dans le fileno d'un objet socket (), qui retourne le descripteur de fichier de l'objet. PID est sans importance dans ce cas. add_handler
pour IOLoop de mon serveur Tornado pour ajouter un gestionnaire pour chaque nouveau PID que je crée à cette IOLoop. J'ai fait quelque chose semblable avant, mais il utilisais popen et une commande arbitraire. Un exemple d'une telle utilisation de cette méthode est
Autres conseils
Découvrez ce projet:
https://github.com/vukasin/tornado-subprocess
il vous permet de lancer des processus arbitraires de tornade et obtenir un rappel quand ils ont fini (avec accès à leur statut, stdout et stderr).