Pour une partie de mon projet, j'ai besoin d'un système de planification de processus local qui me permettra de retarder l'exécution de la méthode sur quelques secondes. J'ai des milliers de "clients" de ce système, donc en utilisant threading.Timer
pour chaque retard est une mauvaise idée parce que j'atteindrai rapidement la limite de fil OS. J'ai implemented un système qui utilise un seul thread pour le contrôle de la synchronisation.Ordonnancement d'appel de méthode rapide en Python
L'idée principale est de conserver la file d'attente de tâches (time + func + args + kwargs) triées et d'utiliser threading.Timer
pour planifier/annuler les exécutions de la tête de cette file d'attente. Ce système fonctionne, mais je ne suis pas satisfait de la performance. ~ 2000 clients qui planifient des tâches factices toutes les ~ 10 secondes font que le processus prend 40% du temps CPU. En regardant la sortie du profileur, je vois que tout le temps est consacré à la construction du nouveau threading.Timer
, à son démarrage et en particulier à la création de nouveaux threads.
Je crois qu'il y a un meilleur moyen. Maintenant, je pense à réécrire le LightTimer
de sorte qu'il y aura un thread d'exécution contrôlable par threading.Event
et plusieurs threads de chronométrage qui set()
l'événement. Par exemple:
- Je programme une tâche à appeler en 10 secondes. La tâche est ajoutée à une file d'attente. Le fil de synchronisation n ° 1 commence
time.sleep(10)
avantevent.set()
- Ensuite, je programme une tâche à appeler en 11 secondes. La tâche est ajoutée à la file d'attente. Rien ne se passe avec le fil de synchronisation, il remarquera une nouvelle tâche après le réveil.
- Ensuite, je programme une tâche à appeler en 5 secondes. La tâche est ajoutée à la file d'attente. Le fil de synchronisation n ° 2 commence
time.sleep(5)
parce que # 1 dort déjà pendant un intervalle plus long.
J'espère que vous avez compris l'idée. Que penses-tu de cette façon? Y a-t-il un meilleur moyen? Peut-être que je peux utiliser certaines fonctionnalités du système Linux pour faire une solution optimale?
Hm ... très intéressant, merci! Surtout que je n'ai jamais regardé 'heapq' et je n'ai pas pensé à utiliser' threading.Condition' dans ce but. – nkrkv