Concurrence en Python - Introduction

Dans ce chapitre, nous allons comprendre le concept de concurrence en Python et découvrir les différents threads et processus.

Qu'est-ce que la concurrence?

En termes simples, la concurrence est l'occurrence de deux événements ou plus en même temps. La concurrence est un phénomène naturel car de nombreux événements se produisent simultanément à un moment donné.

En termes de programmation, la concurrence se produit lorsque deux tâches se chevauchent en exécution. Grâce à la programmation simultanée, les performances de nos applications et de nos systèmes logiciels peuvent être améliorées car nous pouvons traiter simultanément les demandes plutôt que d'attendre qu'une précédente soit terminée.

Revue historique de la concurrence

Les points suivants nous donneront un bref aperçu historique de la concurrence -

Du concept des chemins de fer

La concurrence est étroitement liée au concept des chemins de fer. Avec les chemins de fer, il était nécessaire de gérer plusieurs trains sur le même système ferroviaire de manière à ce que chaque train arrive à destination en toute sécurité.

Calcul simultané dans le milieu universitaire

L'intérêt pour la concurrence informatique a commencé avec le document de recherche publié par Edsger W. Dijkstra en 1965. Dans cet article, il a identifié et résolu le problème de l'exclusion mutuelle, la propriété du contrôle de la concurrence.

Primitives de concurrence de haut niveau

Ces derniers temps, les programmeurs obtiennent des solutions simultanées améliorées en raison de l'introduction de primitives de concurrence de haut niveau.

Amélioration de la concurrence avec les langages de programmation

Les langages de programmation tels que Golang, Rust et Python de Google ont réalisé des développements incroyables dans des domaines qui nous aident à obtenir de meilleures solutions simultanées.

Qu'est-ce que le thread et le multithreading?

Threadest la plus petite unité d'exécution pouvant être effectuée dans un système d'exploitation. Ce n'est pas en soi un programme mais s'exécute dans un programme. En d'autres termes, les threads ne sont pas indépendants les uns des autres. Chaque thread partage une section de code, une section de données, etc. avec d'autres threads. Ils sont également connus sous le nom de processus légers.

Un thread se compose des composants suivants -

  • Compteur de programme composé de l'adresse de la prochaine instruction exécutable

  • Stack

  • Ensemble de registres

  • Un identifiant unique

Multithreading, d'autre part, est la capacité d'un processeur à gérer l'utilisation du système d'exploitation en exécutant plusieurs threads simultanément. L'idée principale du multithreading est de réaliser le parallélisme en divisant un processus en plusieurs threads. Le concept de multithreading peut être compris à l'aide de l'exemple suivant.

Exemple

Supposons que nous exécutions un processus particulier dans lequel nous ouvrons MS Word pour y saisir du contenu. Un fil sera assigné pour ouvrir MS Word et un autre fil sera nécessaire pour y taper du contenu. Et maintenant, si nous voulons modifier l'existant, un autre thread sera nécessaire pour effectuer la tâche d'édition et ainsi de suite.

Qu'est-ce que le processus et le multitraitement?

UNEprocessest défini comme une entité, qui représente l'unité de travail de base à mettre en œuvre dans le système. Pour le dire simplement, nous écrivons nos programmes informatiques dans un fichier texte et lorsque nous exécutons ce programme, il devient un processus qui effectue toutes les tâches mentionnées dans le programme. Au cours du cycle de vie du processus, il passe par différentes étapes: démarrage, prêt, exécution, attente et arrêt.

Le diagramme suivant montre les différentes étapes d'un processus -

Un processus ne peut avoir qu'un seul thread, appelé thread principal, ou plusieurs threads ayant leur propre ensemble de registres, compteur de programmes et pile. Le diagramme suivant nous montrera la différence -

Multiprocessing,d'autre part, est l'utilisation de deux ou plusieurs unités CPU dans un seul système informatique. Notre objectif principal est d'exploiter pleinement le potentiel de notre matériel. Pour y parvenir, nous devons utiliser le nombre total de cœurs de processeur disponibles dans notre système informatique. Le multitraitement est la meilleure approche pour ce faire.

Python est l'un des langages de programmation les plus populaires. Voici quelques raisons qui le rendent adapté aux applications simultanées -

Sucre syntaxique

Le sucre syntaxique est une syntaxe dans un langage de programmation conçu pour rendre les choses plus faciles à lire ou à exprimer. Cela rend le langage «plus doux» pour l'usage humain: les choses peuvent être exprimées plus clairement, plus concis ou dans un style alternatif basé sur les préférences. Python est livré avec des méthodes Magic, qui peuvent être définies pour agir sur des objets. Ces méthodes Magic sont utilisées comme sucre syntaxique et liées à des mots-clés plus faciles à comprendre.

Grande communauté

Le langage Python a connu un taux d'adoption massif parmi les scientifiques des données et les mathématiciens, travaillant dans le domaine de l'IA, de l'apprentissage automatique, de l'apprentissage en profondeur et de l'analyse quantitative.

API utiles pour la programmation simultanée

Python 2 et 3 ont un grand nombre d'API dédiées à la programmation parallèle / simultanée. Les plus populaires d'entre eux sontthreading, concurrent.features, multiprocessing, asyncio, gevent and greenlets, etc.

Limitations de Python dans l'implémentation d'applications simultanées

Python est livré avec une limitation pour les applications simultanées. Cette limitation s'appelleGIL (Global Interpreter Lock)est présent dans Python. GIL ne nous permet jamais d'utiliser plusieurs cœurs de CPU et nous pouvons donc dire qu'il n'y a pas de vrais threads en Python. Nous pouvons comprendre le concept de GIL comme suit -

GIL (Global Interpreter Lock)

C'est l'un des sujets les plus controversés du monde Python. En CPython, GIL est le mutex - le verrou d'exclusion mutuelle, qui sécurise les threads. En d'autres termes, nous pouvons dire que GIL empêche plusieurs threads d'exécuter du code Python en parallèle. Le verrou ne peut être détenu que par un seul thread à la fois et si nous voulons exécuter un thread, il doit d'abord acquérir le verrou. Le diagramme ci-dessous vous aidera à comprendre le fonctionnement de GIL.

Cependant, il existe certaines bibliothèques et implémentations en Python telles que Numpy, Jpython et IronPytbhon. Ces bibliothèques fonctionnent sans aucune interaction avec GIL.