Maison développement back-end Tutoriel Python Exemple détaillé de la façon dont Python gère les problèmes de concurrence via les contrats à terme

Exemple détaillé de la façon dont Python gère les problèmes de concurrence via les contrats à terme

May 11, 2018 pm 05:54 PM
future python 处理

Cet article présente principalement Python pour traiter les problèmes de concurrence dans le futur. Il est très bon et a une valeur de référence. Les amis dans le besoin peuvent s'y référer

Première introduction au futur

Utilisez le script suivant pour avoir une compréhension préliminaire du futur :

Exemple 1 : Méthode de boucle ordinaire

import os
import time
import sys
import requests
POP20_CC = (
 "CN IN US ID BR PK NG BD RU JP MX PH VN ET EG DE IR TR CD FR"
).split()
BASE_URL = 'http://flupy.org/data/flags'
DEST_DIR = 'downloads/'
def save_flag(img,filename):
 path = os.path.join(DEST_DIR,filename)
 with open(path,'wb') as fp:
 fp.write(img)
def get_flag(cc):
 url = "{}/{cc}/{cc}.gif".format(BASE_URL,cc=cc.lower())
 resp = requests.get(url)
 return resp.content
def show(text):
 print(text,end=" ")
 sys.stdout.flush()
def download_many(cc_list):
 for cc in sorted(cc_list):
 image = get_flag(cc)
 show(cc)
 save_flag(image,cc.lower()+".gif")
 return len(cc_list)
def main(download_many):
 t0 = time.time()
 count = download_many(POP20_CC)
 elapsed = time.time()-t0
 msg = "\n{} flags downloaded in {:.2f}s"
 print(msg.format(count,elapsed))
if __name__ == '__main__':
 main(download_many)
Copier après la connexion

Exemple 2 : Implémenté via la méthode future, nous réutilisons ici une partie du code ci-dessus

 from concurrent import futures
from flags import save_flag, get_flag, show, main
MAX_WORKERS = 20
def download_one(cc):
 image = get_flag(cc)
 show(cc)
 save_flag(image, cc.lower()+".gif")
 return cc
def download_many(cc_list):
 workers = min(MAX_WORKERS,len(cc_list))
 with futures.ThreadPoolExecutor(workers) as executor:
 res = executor.map(download_one, sorted(cc_list))
 return len(list(res))
if __name__ == '__main__':
 main(download_many)
Copier après la connexion

Exécuté trois fois respectivement, la vitesse moyenne des deux est : 13,67 et 1.59s, vous voyez que la différence est encore très grande.

futur

futur est un composant important du module concurrent.futures et du module asyncio

À partir de python3.4, il existe deux classes nommées Future dans la bibliothèque standard : concurrent.futures.Future et asyncio.Future
. Ces deux classes ont la même fonction : les instances des deux classes Future représentent des choses qui peuvent être complétées. ou pas encore terminé. Fonctions similaires à la classe Deferred dans Twisted et la classe Future dans le framework Tornado

Remarque : Normalement, vous ne devez pas créer de futur vous-même, mais l'instancier par le framework de concurrence (concurrent.futures ou asyncio)

Raison : future représente quelque chose qui finira par arriver, et la seule façon de déterminer que quelque chose se produira est que le temps d'exécution a été planifié, donc seulement lorsque quelque chose est transmis à la sous-classe concurrent.futures.Executor pour traitement, Une instance concurrent.futures.Future sera créée.
Par exemple : le paramètre de la méthode Executor.submit() est un objet appelable. Après avoir appelé cette méthode, l'heure sera planifiée pour l'objet appelable entrant et un

futur

< le sera. être renvoyé. 🎜>Le code client ne peut pas changer l'état du futur. Le cadre de concurrence changera l'état du futur après la fin du calcul retardé représenté par le futur. Nous ne pouvons pas contrôler la fin du calcul.

Les deux futurs ont une méthode .done(). Cette méthode ne bloque pas et la valeur de retour est une valeur booléenne, indiquant si l'objet appelable lié au futur a été exécuté. Le code client ne demande généralement pas si le futur est terminé, mais attendra une notification. Par conséquent, les deux classes Future ont la méthode .add_done_callback(). Cette méthode n'a qu'un seul paramètre et le type est un objet appelable. L'objet appelable spécifié sera appelé après l'exécution du futur. La méthode

.result() a la même fonction dans les deux classes Future : renvoyer le résultat de l'objet appelable, ou relancer l'exception levée lors de l'exécution de l'objet appelable. Mais si le futur ne s'arrête pas, le comportement de la méthode result dans les deux classes Future est très différent.


Pour les instances concurrent.futures.Future, l'appel de la méthode .result() bloquera le thread de l'appelant jusqu'à ce qu'il y ait un résultat à retourner. À ce moment, la méthode result peut recevoir un facultatif. Paramètre timeout, si l'exécution du futur ne se termine pas dans le délai spécifié, une exception TimeoutError sera levée.


La méthode asyncio.Future.result ne prend pas en charge la définition du délai d'attente. Il est préférable d'utiliser le rendement de la structure pour obtenir des résultats futurs, mais concurrent.futures.Future ne peut pas le faire

Peu importe qu'il s'agisse d'asyncio ou de concurrent.futures.Future, il y aura plusieurs fonctions qui renvoient future, et d'autres fonctions utilisent future. Dans le premier exemple, le Executor.map que nous avons utilisé utilise future, et la valeur de retour est un. iterator. L'itérateur La méthode __next__ appelle la méthode résultat de chaque futur, donc ce que nous obtenons est le résultat de chaque futur, pas le futur lui-même

Concernant l'utilisation de la fonction future.as_completed, nous en utilisons ici deux. boucles, une avec Pour créer et planifier le futur, l'autre est utilisée pour obtenir le résultat du futur

from concurrent import futures
from flags import save_flag, get_flag, show, main
MAX_WORKERS = 20
def download_one(cc):
 image = get_flag(cc)
 show(cc)
 save_flag(image, cc.lower()+".gif")
 return cc
def download_many(cc_list):
 cc_list = cc_list[:5]
 with futures.ThreadPoolExecutor(max_workers=3) as executor:
 to_do = []
 for cc in sorted(cc_list):
  future = executor.submit(download_one,cc)
  to_do.append(future)
  msg = "Secheduled for {}:{}"
  print(msg.format(cc,future))
 results = []
 for future in futures.as_completed(to_do):
  res = future.result()
  msg = "{}result:{!r}"
  print(msg.format(future,res))
  results.append(res)
 return len(results)
if __name__ == &#39;__main__&#39;:
 main(download_many)
Copier après la connexion
Le résultat est le suivant :

Remarque : le code Python ne peut pas contrôler GIL, toutes les fonctions de la bibliothèque standard qui effectuent des opérations d'E/S bloquantes libéreront le GIL en attendant que le système d'exploitation renvoie les résultats. Exécutez d'autres threads pour l'exécution. C'est précisément pour cette raison que les threads Python peuvent. jouer un rôle dans les applications gourmandes en IO

Ce qui précède est concurrent.futures pour démarrer le thread, ce qui suit est de démarrer le processus à travers celui-ci

concurrent.futures pour démarrer le processus

concurrent.futures La classe ProcessPoolExecutor distribue le travail à plusieurs processus Python, donc si vous devez effectuer un traitement gourmand en CPU, utilisez ce module pour contourner le GIL et utiliser tout le CPU noyaux.

Le principe est qu'un ProcessPoolExecutor crée N interpréteurs Python indépendants, où N est le nombre de cœurs CPU disponibles sur le système.

La méthode d'utilisation est la même que la méthode ThreadPoolExecutor

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Le plan Python de 2 heures: une approche réaliste Le plan Python de 2 heures: une approche réaliste Apr 11, 2025 am 12:04 AM

Vous pouvez apprendre les concepts de programmation de base et les compétences de Python dans les 2 heures. 1. Apprenez les variables et les types de données, 2. Flux de contrôle maître (instructions et boucles conditionnelles), 3. Comprenez la définition et l'utilisation des fonctions, 4. Démarrez rapidement avec la programmation Python via des exemples simples et des extraits de code.

Python: Explorer ses applications principales Python: Explorer ses applications principales Apr 10, 2025 am 09:41 AM

Python est largement utilisé dans les domaines du développement Web, de la science des données, de l'apprentissage automatique, de l'automatisation et des scripts. 1) Dans le développement Web, les cadres Django et Flask simplifient le processus de développement. 2) Dans les domaines de la science des données et de l'apprentissage automatique, les bibliothèques Numpy, Pandas, Scikit-Learn et Tensorflow fournissent un fort soutien. 3) En termes d'automatisation et de script, Python convient aux tâches telles que les tests automatisés et la gestion du système.

Méthode de Navicat pour afficher le mot de passe de la base de données MongoDB Méthode de Navicat pour afficher le mot de passe de la base de données MongoDB Apr 08, 2025 pm 09:39 PM

Il est impossible de visualiser le mot de passe MongoDB directement via NAVICAT car il est stocké sous forme de valeurs de hachage. Comment récupérer les mots de passe perdus: 1. Réinitialiser les mots de passe; 2. Vérifiez les fichiers de configuration (peut contenir des valeurs de hachage); 3. Vérifiez les codes (May Code Hardcode).

Comment utiliser Aws Glue Crawler avec Amazon Athena Comment utiliser Aws Glue Crawler avec Amazon Athena Apr 09, 2025 pm 03:09 PM

En tant que professionnel des données, vous devez traiter de grandes quantités de données provenant de diverses sources. Cela peut poser des défis à la gestion et à l'analyse des données. Heureusement, deux services AWS peuvent aider: AWS Glue et Amazon Athena.

Comment démarrer le serveur avec redis Comment démarrer le serveur avec redis Apr 10, 2025 pm 08:12 PM

Les étapes pour démarrer un serveur Redis incluent: Installez Redis en fonction du système d'exploitation. Démarrez le service Redis via Redis-Server (Linux / MacOS) ou Redis-Server.exe (Windows). Utilisez la commande redis-Cli Ping (Linux / MacOS) ou redis-Cli.exe Ping (Windows) pour vérifier l'état du service. Utilisez un client redis, tel que redis-cli, python ou node.js pour accéder au serveur.

Comment lire la file d'attente redis Comment lire la file d'attente redis Apr 10, 2025 pm 10:12 PM

Pour lire une file d'attente à partir de Redis, vous devez obtenir le nom de la file d'attente, lire les éléments à l'aide de la commande LPOP et traiter la file d'attente vide. Les étapes spécifiques sont les suivantes: Obtenez le nom de la file d'attente: Nommez-le avec le préfixe de "Fitre:" tel que "Fitre: My-Quyue". Utilisez la commande LPOP: éjectez l'élément de la tête de la file d'attente et renvoyez sa valeur, telle que la file d'attente LPOP: My-Queue. Traitement des files d'attente vides: si la file d'attente est vide, LPOP renvoie NIL et vous pouvez vérifier si la file d'attente existe avant de lire l'élément.

Comment afficher la version serveur de redis Comment afficher la version serveur de redis Apr 10, 2025 pm 01:27 PM

Question: Comment afficher la version Redis Server? Utilisez l'outil de ligne de commande redis-Cli --version pour afficher la version du serveur connecté. Utilisez la commande Info Server pour afficher la version interne du serveur et devez analyser et retourner des informations. Dans un environnement de cluster, vérifiez la cohérence de la version de chaque nœud et peut être vérifiée automatiquement à l'aide de scripts. Utilisez des scripts pour automatiser les versions de visualisation, telles que la connexion avec les scripts Python et les informations d'impression.

Dans quelle mesure le mot de passe de Navicat est-il sécurisé? Dans quelle mesure le mot de passe de Navicat est-il sécurisé? Apr 08, 2025 pm 09:24 PM

La sécurité du mot de passe de Navicat repose sur la combinaison de cryptage symétrique, de force de mot de passe et de mesures de sécurité. Des mesures spécifiques incluent: l'utilisation de connexions SSL (à condition que le serveur de base de données prenne en charge et configure correctement le certificat), à la mise à jour régulièrement de NAVICAT, en utilisant des méthodes plus sécurisées (telles que les tunnels SSH), en restreignant les droits d'accès et, surtout, à ne jamais enregistrer de mots de passe.

See all articles