Qual é a diferença entre aiosqlite e SQLite no modo multi-threaded?

Sep 09 2020

Estou tentando processar vários arquivos de forma assíncrona, e o processamento de cada arquivo requer algumas leituras e gravações em um banco de dados SQLite. Estive olhando algumas opções e encontrei o módulo aiosqlite aqui . No entanto, eu estava lendo a documentação do SQLite aqui , e ela diz que suporta o modo multi-threaded. Na verdade, o modo padrão é "serializado", o que significa que "pode ​​ser usado com segurança por vários threads sem nenhuma restrição".

Eu não entendo qual é a diferença. A documentação do aiosqlite diz:

aiosqlite permite a interação com bancos de dados SQLite no loop de evento AsyncIO principal sem bloquear a execução de outras corrotinas enquanto espera por consultas ou buscas de dados. Ele faz isso usando um único thread compartilhado por conexão.

Eu entendo que há uma diferença entre aiosqlite e o modo "multi-threaded" no sqlite porque o modo multi-threaded requer apenas uma conexão por thread, enquanto no aiosqlite, você pode reutilizar esta única conexão em vários threads. Mas não é o mesmo que o modo serializado, onde pode ser "usado por vários threads sem restrição"?

Edit: Minha pergunta agora é "Meu entendimento atual abaixo está correto?":

  1. Sqlite no modo "serializado" pode ser usado por vários threads ao mesmo tempo, então isso seria usado se eu usasse o threadingmódulo em python e gerasse vários threads. Aqui eu tenho as opções de usar uma conexão separada por thread ou compartilhar a conexão entre vários threads.
  2. aiosqlite é usado com asyncio. Portanto, uma vez que asyncio tem várias corrotinas que compartilham um segmento, o aiosqlite também funciona com um segmento. Então, crio uma conexão que compartilho entre todas as corrotinas.
  3. Como aiosqlite é basicamente um wrapper para sqlite, posso combinar a funcionalidade de 1 e 2. Portanto, posso ter vários threads em que cada thread tem um loop de evento assíncio com várias corrotinas. Portanto, a funcionalidade básica do sqlite irá lidar com o multi-threading e o aiosqlite irá lidar com as corrotinas.

Respostas

5 wowkin2 Sep 17 2020 at 18:04

Em primeiro lugar, sobre os tópicos:

Sqlite ... pode ser usado por vários threads ao mesmo tempo

Ainda não será o mesmo por causa do GIL , Threads estão sempre rodando simultaneamente (não em paralelo). A única coisa que com GIL você não sabe quando o tópico será interrompido. Mas o asyncio permite que você alterne entre os threads "manualmente" e na espera de algumas operações de IO (como comunicação de banco de dados).


Deixe-me explicar as diferenças entre os diferentes modos:

  • Single-thread - cria uma única conexão de banco de dados sem mutexes ou quaisquer outros mecanismos para evitar problemas de multi-threading.
  • Multi-thread - cria uma única conexão de banco de dados compartilhada com mutexes que bloqueia essa conexão para cada operação / comunicação com o banco de dados.
  • Serializado - cria várias conexões de banco de dados por thread.

Respondendo a perguntas na atualização:

  1. sim

    Sqlite no modo "serializado" pode ser usado por vários threads ao mesmo tempo, então isso seria usado se eu usasse o módulo de threading em python e gerasse vários threads. Aqui eu tenho as opções de usar uma conexão separada por thread ou compartilhar a conexão entre vários threads.

  2. Sim, ele compartilhará uma única conexão entre eles.

    aiosqlite é usado com asyncio. Portanto, uma vez que asyncio tem várias corrotinas que compartilham um segmento, o aiosqlite também funciona com um segmento. Então, crio uma conexão que compartilho entre todas as corrotinas

  3. sim.

    Como aiosqlite é basicamente um wrapper para sqlite, posso combinar a funcionalidade de 1 e 2. Portanto, posso ter vários threads em que cada thread tem um loop de evento assíncio com várias corrotinas. Portanto, a funcionalidade básica do sqlite irá lidar com o multi-threading e o aiosqlite irá lidar com as corrotinas.