1. ホーム
  2. python

[解決済み] Python sqlite3 と並行処理

2023-01-20 03:12:40

質問

私は、"threading" モジュールを使用するPythonのプログラムを持っています。1秒に一度、私のプログラムは新しいスレッドを開始し、ウェブからいくつかのデータをフェッチし、このデータを私のハードドライブに保存します。これらの結果を保存するためにsqlite3を使用したいのですが、うまくいきません。問題は、次の行にあるようです。

conn = sqlite3.connect("mydatabase.db")

  • この行を各スレッド内に置くと、データベース ファイルがロックされていることを伝える OperationalError が発生します。これは、他のスレッドが sqlite3 接続を通じて mydatabase.db を開いていて、それをロックしていることを意味すると思います。
  • このコードの行をメイン プログラムに入れて、接続オブジェクト (conn) を各スレッドに渡すと、ProgrammingError が発生し、スレッドで作成した SQLite オブジェクトはその同じスレッドでのみ使用できることが示されます。

以前は、私はすべての結果を CSV ファイルに保存しており、このようなファイル ロックの問題は発生しませんでした。うまくいけば、sqlite でこれが可能になります。何かアイデアはありますか?

どのように解決するのですか?

consumer-producerパターンを使用することができます。例えば、スレッド間で共有されるキューを作成することができます。ウェブからデータを取得する最初のスレッドは、共有キューにこのデータをエンキューします。データベース接続を所有する別のスレッドは、キューからデータをデキューし、それをデータベースに渡します。