Qual è la differenza tra aiosqlite e SQLite in modalità multi-thread?
Sto cercando di elaborare in modo asincrono più file e l'elaborazione di ogni file richiede alcune letture e scritture su un database SQLite. Ho esaminato alcune opzioni e ho trovato il modulo aiosqlite qui . Tuttavia, stavo leggendo la documentazione di SQLite qui e dice che supporta la modalità multi-thread. In effetti, la modalità predefinita è "serializzata", il che significa che "può essere utilizzata in modo sicuro da più thread senza restrizioni".
Non capisco quale sia la differenza. La documentazione di aiosqlite dice:
aiosqlite consente l'interazione con i database SQLite sul ciclo di eventi AsyncIO principale senza bloccare l'esecuzione di altre coroutine in attesa di query o recuperi di dati. Lo fa utilizzando un singolo thread condiviso per connessione.
Ho capito che c'è una differenza tra aiosqlite e la modalità "multi-thread" su sqlite perché la modalità multi-thread richiede solo una connessione per thread, mentre in aiosqlite, puoi riutilizzare questa singola connessione su più thread. Ma non è lo stesso della modalità serializzata in cui può essere "utilizzata da più thread senza restrizioni"?
Modifica: la mia domanda in questo momento è "La mia attuale comprensione di seguito è corretta?":
- Sqlite in modalità "serializzata" può essere utilizzato da più thread contemporaneamente, quindi questo sarebbe usato se usassi il
threadingmodulo in python e generassi più thread. Qui ho la possibilità di utilizzare una connessione separata per thread o condividere la connessione su più thread. - aiosqlite è usato con asyncio. Quindi, poiché asyncio ha più coroutine che condividono un thread, aiosqlite funziona anche con un thread. Quindi creo una connessione che condivido tra tutte le coroutine.
- Poiché aiosqlite è fondamentalmente un wrapper per sqlite, posso combinare le funzionalità di 1 e 2. Quindi posso avere più thread in cui ogni thread ha un ciclo di eventi asincrono con più coroutine. Quindi la funzionalità sqlite di base gestirà il multi-threading e aiosqlite gestirà le coroutine.
Risposte
Prima di tutto sui thread:
Sqlite ... può essere utilizzato da più thread contemporaneamente
Non sarà ancora la stessa ora a causa di GIL , i thread sono sempre in esecuzione contemporaneamente (non in parallelo). L'unica cosa che con GIL non sai quando il thread verrà interrotto. Ma asyncio ti consente di passare da un thread all'altro "manualmente" e in attesa di alcune operazioni di I / O (come la comunicazione con il database).
Lascia che ti spieghi le differenze tra le diverse modalità:
- Single-thread : crea una singola connessione al database senza mutex o altri meccanismi per prevenire problemi di multi-threading.
- Multi-thread : crea una singola connessione al database condiviso con mutex che blocca tale connessione per ogni operazione / comunicazione con il database.
- Serializzato : crea più connessioni al database per thread.
Risposte alle domande in aggiornamento:
sì
Sqlite in modalità "serializzata" può essere utilizzato da più thread contemporaneamente, quindi questo sarebbe usato se usassi il modulo di threading in Python e generassi più thread. Qui ho la possibilità di utilizzare una connessione separata per thread o condividere la connessione su più thread.
Sì, condividerà una singola connessione tra di loro.
aiosqlite è usato con asyncio. Quindi, poiché asyncio ha più coroutine che condividono un thread, aiosqlite funziona anche con un thread. Quindi creo una connessione che condivido tra tutte le coroutine
Sì.
Poiché aiosqlite è fondamentalmente un wrapper per sqlite, posso combinare le funzionalità di 1 e 2. Quindi posso avere più thread in cui ogni thread ha un ciclo di eventi asincrono con più coroutine. Quindi la funzionalità sqlite di base gestirà il multi-threading e aiosqlite gestirà le coroutine.