2016-12-09 5 views
1

ScénarioComment python fonctionne en interne? Est-ce que plusieurs interpréteurs de python peuvent rendre l'utilisation du processeur trop élevée?

j'invoque des scripts Python à l'aide exec (...) en php et python fonctionne sa part et de l'environnement non structuré, il n'y a pas django ou tout autre cadre.

Et un produit est client & la plupart des tâches sont des tâches de longue durée. Donc, s'il y a une demande du client, elle doit être immédiatement satisfaite. Ici, pour nous, le temps est également une préoccupation majeure que nous ne pouvons pas retarder le processus.

Donc, si j'obtiens trop de requêtes du client (Peut-être, les crons fonctionnent aussi en même temps), j'obtiendrai trop de processus python et selon ma connaissance chaque exec (...) appellera l'interpréteur . Donc, si de toute façon je peux empêcher d'appeler l'interprète à chaque appel, ce sera bon pour moi. L'espace mémoire de 1Kb ou 1Mb est très utile.

Problèmes

  1. utilisation de la mémoire est élevée (Si je peux sauver 1Mb, je veux essayer une solution. Le script supposant est bien écrit. Bon sommeil est donnée en boucle et garbage collector est bien géré.)
  2. Parfois, pour un script Python long, si ce script est appelé à partir de php, en utilisant exec (...) et le processus n'est pas appelé en arrière-plan, et ce script python est terminé, et il faut encore Tim e pour exécuter la ligne suivante après cet exec.

Solution

Pour la solution, je pensais que je devrais utiliser les appels API pour Python. Mais rappelez-vous que je ne peux pas utiliser de cadre. Pour utiliser le framework, j'ai besoin de réécrire le code, ce qui n'est pas possible dans mon cas. CGI et FCGI peuvent donc m'aider ici. Pour exécuter des scripts Python à partir d'appels API, j'ai besoin d'activer CGI pour s'exécuter.

Mais ce que je trouve intéressant est ::

Les programmes utilisant CGI, pour communiquer avec leur serveur web, doivent être commencé par le serveur pour chaque demande. Donc, chaque requête démarre un nouvel interpréteur Python - qui prend un certain temps à démarrer - rendant ainsi toute l'interface utilisable uniquement pour les situations de faible charge.

common-gateway-interface.

Si j'exécuter un script comme suit, que tout commencera à la fois

subprocess.Popen(["python", "program1.py"]) 
subprocess.Popen(["python", "program2.py"]) 
subprocess.Popen(["python", "program3.py"]) 
subprocess.Popen(["python", "program4.py"]) 
subprocess.Popen(["python", "program5.py"]) 
subprocess.Popen(["python", "program6.py"]) 

Supposons que tous les programmes sont ce travail de longue course.

1) Puis-je empêcher module python de créer plus interprète et si oui, comment puis-je?

2) Combien d'interprètes le maximum, un module python peut créer (à la fois comme le code ci-dessus)?

+0

Si tel est votre script, il tournera jusqu'à 6 interprètes python ... – mgilson

+0

Post est peu modifiée. Et si vous avez 100 scripts, cela va créer 100 interprètes. Alors, combien d'interprètes un module python peut-il gérer? Je suis confronté à ce scénario sur mon propre serveur. –

Répondre

0

Je ne sais pas si je comprends bien ce que vous avez demandé. En général, dans n'importe quel contexte, le code est exécuté de manière séquentielle, à moins qu'il ne soit explicitement dit de ne pas le faire. Si vous placez ces lignes dans votre shell, votre shell démarre d'abord une instance de python pour program1.py. Vous ne pouvez pas continuer à exécuter program2.py tant que vous n'avez pas terminé program1.py. Donc, vous n'avez qu'un seul interpréteur Python à tout moment.

Si vous souhaitez exécuter chaque script en arrière-plan, vous devez mettre & à la fin de chaque ligne python program1.py &. De cette façon, vous pouvez exécuter plusieurs scripts en même temps. Si vos scripts mettent longtemps à se terminer, 6 interprètes fonctionneront en même temps. Je suis sûr que chaque script a besoin d'un interprète.

+0

Oui, j'ai appris par le commentaire qu'il va créer 6 interprètes. Comment puis-je empêcher cela? –

+0

Pour empêcher votre script de démarrer six interpréteurs distincts, n'incluez pas de code dans celui-ci qui démarre six interprètes distincts. – kindall

+0

Je pense que c'est un comportement normal d'avoir plusieurs instances de Python si vous travaillez avec CGI. Il n'y a rien de mal à ce sujet et la solution de contournement peut ne pas être facile. Si vous n'aimez pas cela, je vous recommande de commencer à utiliser le framework web comme Django. –