web-dev-qa-db-fra.com

Contrôle de la priorité de planification de python threads?

J'ai écrit un script qui utilise deux piscines de fil de dix threads chacun pour tirer dans des données d'une API. L'implémentation du pool de threads Ce code sur Activestate . Chaque piscine de threads surveille une base de données REDIS via PUBSUB pour les nouvelles entrées. Lorsqu'une nouvelle entrée est publiée, python transmet les données à une fonction utilisant Python's Subprocess.popen Pour exécuter une coquille PHP pour faire le travail réel d'appeler le travail d'appel API.

Ce système de lancement de PHP coquilles est nécessaire à la fonctionnalité avec mon application Web PHP, de sorte que le lancement de PHP coquilles avec Python ne peut pas être évité.

Ce script ne sera exécuté que sur des serveurs Linux.

Comment contrôler le Nicness (priorité de planification) des threads de l'application?

modifier:

Il semble de contrôler la priorité de planification des fils individuels dans Python n'est pas possible. Existe-t-il une solution python ou au moins une commande UNIX, je peux courir avec mon script, pour contrôler la priorité?

Edit 2:

Eh bien, je n'ai pas fini de trouver un moyen python de le gérer. Je dirige juste mon script avec gentil maintenant comme ça:

Nice -n 19 python MyScript.py
23
backus

Je crois que la priorité de threading n'est pas contrôlable dans python en raison de la manière dont elles sont implémentées à l'aide d'un verrouillage d'interpréteur global (GIL). Cela dit que, même si vous pouviez donner un fil de traitement plus de priorité de traitement de la CPU, le python Mise en œuvre qui maintes autour de la gil ne serait pas conscient de ceci alors qu'il est confié à la gil. Si vous pouviez augmenter la gentillesse dans un seul fil dans votre piscine (disons que cela fait un Travaux plus importants) Vous auriez besoin d'utiliser votre propre implémentation de serrures pour donner l'accès au fil de priorité plus élevé au gil plus souvent.

Une recherche Google renvoie cet article que je crois est semblable à ce que vous demandez

Explique pourquoi cela ne fonctionne pas http://www.velocityreviews.com/forums/t329441-threading-priority.html

Explique la solution de contournement que je suggère http://bytes.com/topic/python/answers/645966-Setting-Triorities

17
Paul Seeb

Je sais que beaucoup de temps ont passé, mais j'ai récemment rencontré cette question et je pensais qu'il serait utile d'ajouter une autre option.

Regardez filetage2 , qui est un Remplacement Remplacement et extension pour la valeur par défaut Thilfing module, avec support - type de - pour Priorité et affinité.

3
Luca Lenardi

Je me demandais si cette réponse à une autre question connexe pourrait être utile dans ce scénario? (- link )

Comme vous utilisez déjà subprocess.popen Pour lancer votre script PHP, il me frappe que vous pouvez utiliser "PREEXEC_FN" et une fonction prédéfinie, ou une fonction Lambda (comme démontré dans la réponse liée ci-dessus) Pour définir le bon niveau de chaque thread de chacun lancé PHP?

1
Spam Hater

Cela ne fonctionne pas, mais j'ai essayé:

  1. obtenir le parent PID et la priorité
  2. lancement de threads en utilisant Concurrent.Futures.threadPoolEcutor
  3. utilisation de CTTYPES pour obtenir l'ID de thread (Linux) de l'intérieur du fil (travaux)
  4. utilisation de la TID avec Os.SePriority (OS.Prio_Process, Tid, Parent_Priority + 1)
  5. appeler piscine.shutdown () du parent.

Même avec sprinling libéral de Os.Sched_yield (), les fils d'enfants ne couraient jamais au-delà de la compréhension ().

Lire des pages de l'homme, il semble que les threads n'ont pas la capacité de changer (même leur) la priorité de planification; Vous devez faire quelque chose avec des "capacités" pour donner le fil la capacité "CAP_SYS_NICE". L'exécution du processus avec des autorisations root n'a pas aidé non plus; Les fils d'enfants ne fonctionnent toujours pas.

1
Andrew Wagner

Le python threading-docs Mention explicitement qu'il n'y a aucun support pour la définition des priorités de thread:

La conception de ce module est de manière lâche sur le modèle de threading de Java. Cependant, où Java affectuez des verrous et des variables de condition Comportement de base de chaque objet, ce sont des objets distincts dans Python. La classe de thread de Python prend en charge un sous-ensemble du comportement de la classe de thread de Java; Actuellement, il n'y a pas de priorités , aucun groupe de fil et des fils ne peuvent pas être détruits, arrêtés, suspendus, repris ou interrompu. Les méthodes statiques de la classe de thread de Java, lorsqu'elles sont implémentées, sont mappés sur les fonctions au niveau du module.

0
Darkonaut