


Exemple d'analyse de plusieurs tâches planifiées exécutées dans un seul thread dans le développement Python
Tâches multi-times monothread
1. Version initiale :
Idée : timer , pour parler franchement, cela signifie retarder l'exécution du programme spécifié. Actuellement, il n'est pas pratique de reconstruire le timer en Python par vous-même, et la capacité n'est pas atteinte, donc le timer système doit être utilisé pour l'opération de retard, mais nous pouvons changer les règles ; tous les programmes qui doivent effectuer des opérations planifiées sont ajoutés à une liste spécifique, supprimer le programme avec la durée planifiée la plus courte de la liste, lier le thread.Timer (heure, rappel), attendre le temps de expirez, déclenchez un rappel personnalisé et exécutez le programme qui vient d'être supprimé de la liste ;Puis mettez à jour l'heure, supprimez à nouveau le programme avec le temps le plus court de la liste, continuez à lier threading.Timer et continuez la boucle itérative quand; une nouvelle tâche planifiée est ajoutée à la liste, annulez le threading.Timer en cours, mettez à jour l'heure dans la liste, supprimez à nouveau le temps le plus court et liez le threading.Timer...
Code :
import threading import time class Timer(): '''单线程下的定时器''' def __init__(self): self.queues = [] self.timer = None self.last_time = time.time() def start(self): item = self.get() if item: self.timer = threading.Timer(item[0],self.execute) self.timer.start() def add(self,item): print('add',item) self.flush_time() self.queues.append(item) self.queues.sort(key=lambda x:x[0]) if self.timer: self.timer.cancel() self.timer = None self.start() def get(self): item = None if len(self.queues) > 0: item = self.queues[0] return item def pop(self): item = None if len(self.queues) > 0: item = self.queues.pop(0) return item def flush_time(self): curr_time = time.time() for i in self.queues: i[0] = i[0] - (curr_time - self.last_time) self.last_time = curr_time def execute(self): # if self.timer: # self.timer.cancel() # self.timer = None item = self.pop() self.flush_time() if item: callback = item[1] args = item[0] callback(args) self.start()
Exécution et sortie :
if __name__ == '__main__': # 检测线程数 def func(): while True: print(threading.active_count()) time.sleep(1) f1 = threading.Thread(target=func) f1.start() import logging logging.basicConfig(level=logging.INFO,format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]") def func1(*args): logging.info('func1 %s'%args) # time.sleep(5) def func2(*args): logging.info('func2 %s' % args) # time.sleep(5) def func3(*args): logging.info('func3 %s' % args) # time.sleep(5) def func4(*args): logging.info('func4 %s' % args) # time.sleep(5) def func5(*args): logging.info('func5 %s' % args) # time.sleep(5) # 测试 t1 = Timer() logging.info('start') t1.add([5,func1]) time.sleep(0.5) t1.add([4,func2]) time.sleep(0.5) t1.add([3,func3]) time.sleep(0.5) t1.add([2,func4]) time.sleep(0.5) t1.add([1,func5]) time.sleep(5) t1.add([1,func1]) t1.add([2,func2]) t1.add([3,func3]) t1.add([4,func4]) t1.add([5,func5]) # 输出 # 2 # 07/27/2017 10:36:47 [Thursday] start # add [5, <function func1 at 0x000000D79FC77E18>] # add [4, <function func2 at 0x000000D79FCA8488>] # 3 # add [3, <function func3 at 0x000000D79FCA8510>] # add [2, <function func4 at 0x000000D79FCA8598>] # 3 # add [1, <function func5 at 0x000000D79FCA8620>] # 3 # 07/27/2017 10:36:50 [Thursday] func5 1 # 07/27/2017 10:36:51 [Thursday] func4 0.498349666595459 # 3 # 07/27/2017 10:36:51 [Thursday] func3 0.49782633781433105 # 07/27/2017 10:36:52 [Thursday] func2 0.49848270416259766 # 3 # 07/27/2017 10:36:52 [Thursday] func1 0.48449039459228516 # 2 # 2 # add [1, <function func1 at 0x000000D79FC77E18>] # add [2, <function func2 at 0x000000D79FCA8488>] # add [3, <function func3 at 0x000000D79FCA8510>] # add [4, <function func4 at 0x000000D79FCA8598>] # add [5, <function func5 at 0x000000D79FCA8620>] # 3 # 07/27/2017 10:36:55 [Thursday] func1 0.9990766048431396 # 3 # 07/27/2017 10:36:56 [Thursday] func2 0.9988017082214355 # 3 # 07/27/2017 10:36:57 [Thursday] func3 0.99928879737854 # 07/27/2017 10:36:58 [Thursday] func4 0.9991350173950195 # 3 # 3 # 07/27/2017 10:36:59 [Thursday] func5 0.9988160133361816
Exécuter le code
Remarque : en regardant la sortie du code, tous les minuteurs sont exécutés dans l'ordre selon le temps calibré, ce qui est parfait. Tout est beau, mais il semble que, hahaha, lorsque vous activez time.sleep(5) dans func, le nombre de threads augmente lentement, la raison est que le dernier rappel du minuteur est toujours en cours d'exécution ; , et le minuteur suivant a été démarré, puis un nouveau minuteur est ajouté, hélas, a échoué
2. Version révisée .
Idée : Utiliser le générateur Le modèle consommateur utilise la variable de condition threading.Condition ; il est obligé de toujours activer un Timer !
Code :
import time import threading import logging class NewTimer(threading.Thread): '''单线程下的定时器''' def __init__(self): super().__init__() self.queues = [] self.timer = None self.cond = threading.Condition() def run(self): while True: # print('NewTimer',self.queues) self.cond.acquire() item = self.get() callback = None if not item: logging.info('NewTimer wait') self.cond.wait() elif item[0] <= time.time(): new_item = self.pop() callback = new_item[1] else: logging.info('NewTimer start sys timer and wait') self.timer = threading.Timer(item[0]-time.time(),self.execute) self.timer.start() self.cond.wait() self.cond.release() if callback: callback(item[0]) def add(self, item): # print('add', item) self.cond.acquire() item[0] = item[0] + time.time() self.queues.append(item) self.queues.sort(key=lambda x: x[0]) logging.info('NewTimer add notify') if self.timer: self.timer.cancel() self.timer = None self.cond.notify() self.cond.release() def pop(self): item = None if len(self.queues) > 0: item = self.queues.pop(0) return item def get(self): item = None if len(self.queues) > 0: item = self.queues[0] return item def execute(self): logging.info('NewTimer execute notify') self.cond.acquire() self.cond.notify() self.cond.release()
Exécution et sortie :
if __name__ == '__main__': def func(): while True: print(threading.active_count()) time.sleep(1) f1 = threading.Thread(target=func) f1.start() logging.basicConfig(level=logging.INFO,format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]") newtimer = NewTimer() newtimer.start() def func1(*args): logging.info('func1 %s'%args) time.sleep(5) def func2(*args): logging.info('func2 %s' % args) time.sleep(5) def func3(*args): logging.info('func3 %s' % args) time.sleep(5) def func4(*args): logging.info('func4 %s' % args) time.sleep(5) def func5(*args): logging.info('func5 %s' % args) time.sleep(5) newtimer.add([5,func1]) newtimer.add([4,func2]) newtimer.add([3,func3]) newtimer.add([2,func4]) newtimer.add([1,func5]) time.sleep(1) newtimer.add([1,func1]) newtimer.add([2,func2]) newtimer.add([3,func3]) newtimer.add([4,func4]) newtimer.add([5,func5])# 输出# 2# 07/27/2017 11:26:19 [Thursday] NewTimer wait# 07/27/2017 11:26:19 [Thursday] NewTimer add notify# 07/27/2017 11:26:19 [Thursday] NewTimer add notify# 07/27/2017 11:26:19 [Thursday] NewTimer add notify# 07/27/2017 11:26:19 [Thursday] NewTimer add notify# 07/27/2017 11:26:19 [Thursday] NewTimer add notify# 07/27/2017 11:26:19 [Thursday] NewTimer start sys timer and wait# 07/27/2017 11:26:20 [Thursday] NewTimer execute notify# 4# 07/27/2017 11:26:20 [Thursday] func5 1501125980.2175007# 07/27/2017 11:26:20 [Thursday] NewTimer add notify# 07/27/2017 11:26:20 [Thursday] NewTimer add notify# 07/27/2017 11:26:20 [Thursday] NewTimer add notify# 07/27/2017 11:26:20 [Thursday] NewTimer add notify# 07/27/2017 11:26:20 [Thursday] NewTimer add notify# 3# 3# 3# 3# 3# 07/27/2017 11:26:25 [Thursday] func4 1501125981.2175007# 3# 3# 3# 3# 07/27/2017 11:26:30 [Thursday] func1 1501125981.218279# 3# 3# 3# 3# 3# 3# 07/27/2017 11:26:35 [Thursday] func3 1501125982.2175007# 3# 3# 3# 3# 07/27/2017 11:26:40 [Thursday] func2 1501125982.218279# 3# 3# 3# 3# 3# 07/27/2017 11:26:45 [Thursday] func2 1501125983.2175007# 3# 3# 3# 3# 3# 07/27/2017 11:26:50 [Thursday] func3 1501125983.218279# 3# 3# 3# 3# 3# 07/27/2017 11:26:55 [Thursday] func1 1501125984.2175007# 3# 3# 3# 3# 3# 07/27/2017 11:27:00 [Thursday] func4 1501125984.218279# 3# 3# 3# 3# 3# 07/27/2017 11:27:05 [Thursday] func5 1501125985.218279# 3# 3# 3# 3# 3# 07/27/2017 11:27:10 [Thursday] NewTimer wait
Sortie
Remarque : quel que soit le numéro du fil de test cette fois, le nombre de threads de test n'augmentera pas lentement , et les exigences de tâches multi-minuteries peuvent être satisfaites en même temps ; Inconvénients : deux threads sont utilisés et un seul thread n'est pas utilisé. Implémentation, deuxième problème de précision du temps, vous devez attendre la fin du dernier programme planifié. le programme peut continuer à fonctionner
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP et Python ont leurs propres avantages et inconvénients, et le choix dépend des besoins du projet et des préférences personnelles. 1.Php convient au développement rapide et à la maintenance des applications Web à grande échelle. 2. Python domine le domaine de la science des données et de l'apprentissage automatique.

Activer l'accélération du GPU Pytorch sur le système CentOS nécessite l'installation de versions CUDA, CUDNN et GPU de Pytorch. Les étapes suivantes vous guideront tout au long du processus: CUDA et CUDNN Installation détermineront la compatibilité de la version CUDA: utilisez la commande NVIDIA-SMI pour afficher la version CUDA prise en charge par votre carte graphique NVIDIA. Par exemple, votre carte graphique MX450 peut prendre en charge CUDA11.1 ou plus. Téléchargez et installez Cudatoolkit: visitez le site officiel de Nvidiacudatoolkit et téléchargez et installez la version correspondante selon la version CUDA la plus élevée prise en charge par votre carte graphique. Installez la bibliothèque CUDNN:

Docker utilise les fonctionnalités du noyau Linux pour fournir un environnement de fonctionnement d'application efficace et isolé. Son principe de travail est le suivant: 1. Le miroir est utilisé comme modèle en lecture seule, qui contient tout ce dont vous avez besoin pour exécuter l'application; 2. Le Système de fichiers Union (UnionFS) empile plusieurs systèmes de fichiers, ne stockant que les différences, l'économie d'espace et l'accélération; 3. Le démon gère les miroirs et les conteneurs, et le client les utilise pour l'interaction; 4. Les espaces de noms et les CGROUP implémentent l'isolement des conteneurs et les limitations de ressources; 5. Modes de réseau multiples prennent en charge l'interconnexion du conteneur. Ce n'est qu'en comprenant ces concepts principaux que vous pouvez mieux utiliser Docker.

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Minio Object Storage: Déploiement haute performance dans le système Centos System Minio est un système de stockage d'objets distribué haute performance développé sur la base du langage Go, compatible avec Amazons3. Il prend en charge une variété de langages clients, notamment Java, Python, JavaScript et GO. Cet article introduira brièvement l'installation et la compatibilité de Minio sur les systèmes CentOS. Compatibilité de la version CentOS Minio a été vérifiée sur plusieurs versions CentOS, y compris, mais sans s'y limiter: CentOS7.9: fournit un guide d'installation complet couvrant la configuration du cluster, la préparation de l'environnement, les paramètres de fichiers de configuration, le partitionnement du disque et la mini

La formation distribuée par Pytorch sur le système CentOS nécessite les étapes suivantes: Installation de Pytorch: La prémisse est que Python et PIP sont installés dans le système CentOS. Selon votre version CUDA, obtenez la commande d'installation appropriée sur le site officiel de Pytorch. Pour la formation du processeur uniquement, vous pouvez utiliser la commande suivante: pipinstalltorchtorchVisionTorChaudio Si vous avez besoin d'une prise en charge du GPU, assurez-vous que la version correspondante de CUDA et CUDNN est installée et utilise la version Pytorch correspondante pour l'installation. Configuration de l'environnement distribué: la formation distribuée nécessite généralement plusieurs machines ou des GPU multiples uniques. Lieu

Lors de l'installation de Pytorch sur le système CentOS, vous devez sélectionner soigneusement la version appropriée et considérer les facteurs clés suivants: 1. Compatibilité de l'environnement du système: Système d'exploitation: Il est recommandé d'utiliser CentOS7 ou plus. CUDA et CUDNN: La version Pytorch et la version CUDA sont étroitement liées. Par exemple, Pytorch1.9.0 nécessite CUDA11.1, tandis que Pytorch2.0.1 nécessite CUDA11.3. La version CUDNN doit également correspondre à la version CUDA. Avant de sélectionner la version Pytorch, assurez-vous de confirmer que des versions compatibles CUDA et CUDNN ont été installées. Version Python: branche officielle de Pytorch

CENTOS L'installation de Nginx nécessite de suivre les étapes suivantes: Installation de dépendances telles que les outils de développement, le devet PCRE et l'OpenSSL. Téléchargez le package de code source Nginx, dézippez-le et compilez-le et installez-le, et spécifiez le chemin d'installation AS / USR / LOCAL / NGINX. Créez des utilisateurs et des groupes d'utilisateurs de Nginx et définissez les autorisations. Modifiez le fichier de configuration nginx.conf et configurez le port d'écoute et le nom de domaine / adresse IP. Démarrez le service Nginx. Les erreurs communes doivent être prêtées à prêter attention, telles que les problèmes de dépendance, les conflits de port et les erreurs de fichiers de configuration. L'optimisation des performances doit être ajustée en fonction de la situation spécifique, comme l'activation du cache et l'ajustement du nombre de processus de travail.
