Pourquoi gevent a besoin de synchronisation puisqu'il est dans un seul thread

user829092

À partir de la documentation Gevent:

Les greenlets s'exécutent tous dans le même thread du système d'exploitation et sont planifiés en coopération.

Alors est-il toujours nécessaire d'utiliser les primitives de verrouillage gevent ou gevent.Queue pour éviter les conditions de concurrence entre plusieurs greenlets dans un seul thread? Un exemple pour démontrer une telle condition de course serait très apprécié. D'après ma propre compréhension, ces primitives de synchronisation semblent être juste un moyen de changer le flux d'exécution entre les greentlets.

Jason Madden

Oui, en général, il est toujours nécessaire d'utiliser des constructions de verrouillage et de synchronisation dans gevent.

Les constructions de verrouillage et de synchronisation, sous les threads et gevent, telles que RLock, Semaphore et Queue sont là pour garantir que l'état du programme est cohérent en interne en protégeant l'accès aux données critiques ou aux sections de code critiques (en fait, en prétendant qu'une telle section ou un tel élément de données fonctionne tout seul).

La différence entre les greenlets et le threading est que si un changement de contexte de thread peut théoriquement se produire à tout moment hors de votre contrôle, un changement de contexte de greenlet ne peut se produire qu'à des moments spécifiques définis, et donc théoriquement, si vous êtes très prudent dans votre programmation et avoir un contrôle complet sur la façon dont la section ou les données critiques sont utilisées, vous pouvez éviter complètement les commutateurs et éliminer le besoin de verrous. Parfois, cela est facile à faire, parfois non, selon le programme. Dans gevent, lorsque les E / S, time.sleep()etc., peuvent tous provoquer des commutations, s'il y a beaucoup de complexité du code, il peut être difficile d'être entièrement sûr qu'il n'y aura pas de commutateurs, donc les règles standard de synchronisation et de verrouillage sont les meilleures.

Voici un exemple. Disons que nous voulons écrire des messages (données structurées) dans un fichier ou un objet semblable à un fichier. Imaginons que les messages soient rassemblés en continu, un morceau à la fois, mais que le destinataire doit être capable de lire le message ensemble en un seul morceau --- l'interconnexion de morceaux de deux messages différents entraîne un désordre brouillé.

def generate_data(chunks): 
  # This task generates the data that makes up a message
  # in chunks.
  # Imagine that each chunk takes some time to generate.
  # Maybe we're pulling data from a database.
  for chunk in chunks:
     yield chunk

def worker_one(file):
  file.write("begin message")
  for chunk in generate_data('abcde'):
     file.write(chunk)
  file.write("end message")

def worker_two(file):
  file.write("begin message")
  for chunk in generate_data('123456'):
     file.write(chunk)
  file.write("end message")

output_file = get_output_file()

workers = [gevent.spawn(worker_one, output_file),
           gevent.spawn(worken_two, output_file)]

gevent.joinall(workers)

Si cela get_output_filerevient simplement open('/some/file'), cela fonctionnera bien: l'utilisation d'un fileobjet normal ne coopère pas avec la boucle gevent, et donc chaque worker fonctionnera jusqu'à la fin sans jamais céder et les messages seront intacts.

Cependant, s'il retournait socket.create_connection(("some.host", 80)).makefile(), cela échouerait et les messages seraient fragmentés. Chaque écriture sur le socket d'un worker pourrait laisser le greenlet se produire et l'autre greenlet s'exécuter, ce qui entraînerait des données brouillées.

Si generate_datac'était plus complexe, peut-être communiquer avec un serveur ou une base de données via une socket gevent, alors même si nous écrivions dans un fichier, les messages pourraient être déformés car les greenlets ont basculé pendant le processus de génération de données.

Ceci est un exemple de la raison pour laquelle l'état partagé (dans ce cas, le socket) peut avoir besoin d'être protégé avec des constructions de synchronisation.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Pourquoi un seul thread est-il plus rapide que le multithreading dans mon code?

Y a-t-il une limite de temps pour un seul appel de synchronisation dans Eloqua ?

Pourquoi mon objet est-il désalloué tout seul lors du changement de thread dans Xcode sans ARC?

Pourquoi il y a un besoin de pageContext dans JSP?

Pourquoi pas besoin de synchroniser le tampon alors qu'il n'y a qu'un seul producteur et un seul consommateur?

Pourquoi un programme C multithread est-il forcé sur un seul processeur sous Mac OS X lorsque system () est utilisé dans un thread?

Pourquoi avons-nous besoin d'utiliser le verrouillage des threads lorsqu'il n'y a qu'un seul thread? (python)

Synchronisation de plusieurs tâches sur un seul thread

Pourquoi le multithread avec CompletableFuture est-il lent par rapport au code à un seul thread?

Pourquoi mon message de rappel est-il exécuté dans un autre thread ?

C ++ si un thread écrit bascule un bool une fois terminé, est-il sûr de lire ce bool dans une boucle dans un seul autre thread?

(C / C ++) Pourquoi est-il dans / valide de synchroniser un seul lecteur et un seul écrivain avec une variable globale?

Est-il thread-safe de modifier un champ DateTimeOffset nullable sans synchronisation

Puisqu'un ListView dans Flutter est sans état, comment se fait-il qu'il puisse être changé?

Pourquoi un seul programme Java threadé a-t-il autant de threads?

Pourquoi proc n'a pas besoin d'un symbole% lorsqu'il est écrit dans une macro SAS

Pourquoi est-il possible d'instancier plusieurs traits dans Scala, mais pas un seul?

Pourquoi Skylake est-il tellement meilleur que Broadwell-E pour le débit de mémoire à un seul thread?

Pthread n'utilisant qu'un seul thread lorsqu'il est encapsulé dans une classe

Avons-nous besoin de synchroniser java HashMap obtient s'il n'y a qu'un seul thread d'écriture

La synchronisation est-elle nécessaire avec un seul thread

Pourquoi Tesseract est-il incapable de détecter le seul chiffre dans cette image ?

| + | est un semi-groupe, pourquoi il a besoin d'une résolution implicite monoïde

Pourquoi Swift a-t-il besoin de ces fonctions similaires? Est-ce un peu redondant?

Pourquoi un seul champ est-il défini lors de la création d'un nouveau document dans Firebase lorsque plusieurs champs sont transmis ?

Pourquoi printf avec un seul argument (sans spécificateurs de conversion) est-il obsolète?

Pourquoi un seul de mes gestionnaires d'événements est-il déclenché?

macOS, est-il possible de terminer un seul thread python?

Pourquoi un seul caractère est-il correctement modifié?

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive