Quelle est la différence entre aiosqlite et SQLite en mode multi-thread?

Sep 09 2020

J'essaie de traiter plusieurs fichiers de manière asynchrone et le traitement de chaque fichier nécessite des lectures et des écritures dans une base de données SQLite. J'ai regardé quelques options et j'ai trouvé le module aiosqlite ici . Cependant, je lisais la documentation SQLite ici , et elle dit qu'elle prend en charge le mode multi-thread. En fait, le mode par défaut est «sérialisé», ce qui signifie qu'il «peut être utilisé en toute sécurité par plusieurs threads sans aucune restriction».

Je ne comprends pas quelle est la différence. La documentation aiosqlite dit:

aiosqlite permet l'interaction avec les bases de données SQLite sur la boucle d'événements AsyncIO principale sans bloquer l'exécution d'autres coroutines en attendant des requêtes ou des récupérations de données. Pour ce faire, il utilise un seul thread partagé par connexion.

Je comprends qu'il y a une différence entre aiosqlite et le mode "multi-thread" sur sqlite car le mode multi-thread ne nécessite qu'une seule connexion par thread, alors que dans aiosqlite, vous pouvez réutiliser cette connexion unique sur plusieurs threads. Mais n'est-ce pas la même chose que le mode sérialisé où il peut être "utilisé par plusieurs threads sans restriction"?

Edit: Ma question en ce moment est "Est-ce que ma compréhension actuelle ci-dessous est correcte?":

  1. Sqlite en mode "sérialisé" peut être utilisé par plusieurs threads à la fois, donc cela serait utilisé si j'utilisais le threadingmodule en python et engendrais plusieurs threads. Ici, j'ai la possibilité d'utiliser une connexion séparée par thread ou de partager la connexion sur plusieurs threads.
  2. aiosqlite est utilisé avec asyncio. Donc, comme asyncio a plusieurs coroutines qui partagent un thread, aiosqlite fonctionne également avec un thread. Je crée donc une connexion que je partage entre toutes les coroutines.
  3. Depuis aiosqlite est fondamentalement un wrapper pour sqlite, je peux combiner les fonctionnalités de 1 et 2. Ainsi je peux avoir plusieurs threads où chaque thread a une boucle d'événement asyncio avec plusieurs coroutines. Ainsi, la fonctionnalité de base de sqlite gérera le multi-threading et l'aiosqlite gérera les coroutines.

Réponses

5 wowkin2 Sep 17 2020 at 18:04

Tout d'abord sur les threads:

Sqlite ... peut être utilisé par plusieurs threads à la fois

Ce ne sera toujours pas la même heure à cause de GIL , les threads sont toujours exécutés simultanément (pas en parallèle). La seule chose qu'avec GIL, vous ne savez pas quand le fil sera interrompu. Mais asyncio vous permet de basculer entre les threads "manuellement" et en attendant certaines opérations d'E / S (comme la communication avec la base de données).


Laissez-moi vous expliquer les différences entre les différents modes:

  • Un seul thread - crée une connexion de base de données unique sans mutex ni aucun autre mécanisme pour éviter les problèmes de multi-threading.
  • Multi-thread - crée une seule connexion de base de données partagée avec des mutex qui verrouille cette connexion pour chaque opération / communication avec la base de données.
  • Sérialisé - crée plusieurs connexions de base de données par thread.

Répondre aux questions dans la mise à jour:

  1. Oui

    Sqlite en mode "sérialisé" peut être utilisé par plusieurs threads à la fois, donc cela serait utilisé si j'utilisais le module de threading en python et engendrais plusieurs threads. Ici, j'ai la possibilité d'utiliser une connexion séparée par thread ou de partager la connexion sur plusieurs threads.

  2. Oui, il partagera une seule connexion entre eux.

    aiosqlite est utilisé avec asyncio. Donc, comme asyncio a plusieurs coroutines qui partagent un thread, aiosqlite fonctionne également avec un thread. Alors je crée une connexion que je partage entre toutes les coroutines

  3. Oui.

    Depuis aiosqlite est fondamentalement un wrapper pour sqlite, je peux combiner les fonctionnalités de 1 et 2. Ainsi je peux avoir plusieurs threads où chaque thread a une boucle d'événement asyncio avec plusieurs coroutines. Ainsi, la fonctionnalité de base de sqlite gérera le multi-threading et l'aiosqlite gérera les coroutines.