私はArch Linux x86_64でPython 3.2.1を使用しています。私は、次のようないくつかのコードとねじ、タイミングループ内のsqliteデータベースを更新しようとしている
:残念ながら返しpython:キューとスレッド間でsqlite接続を共有するには?
import sqlite3
from threading import Timer
from queue import Queue
class DBQueue(Queue):
def give(self, item):
self.task_done()
self.join()
self.put(item)
return True
def timer():
print('A')
Timer(3, add).start()
def add():
print('B')
db = qdb.get()
cur = db.cursor()
cur.execute('INSERT INTO Foo (id) VALUES (NULL)')
qdb.give(db)
timer()
qdb = DBQueue()
# SOLUTION #1:
# qdb.put(sqlite3.connect(':memory:', check_same_thread=False))
# SOLUTION #2: see Eli Bendersky's answer
qdb.put(sqlite3.connect(':memory:'))
db = qdb.get()
cur = db.cursor()
cur.execute('CREATE TABLE Foo (id INTEGER PRIMARY KEY)')
qdb.give(db)
timer()
:
A
B
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.2/threading.py", line 736, in _bootstrap_inner
self.run()
File "/usr/lib/python3.2/threading.py", line 942, in run
self.function(*self.args, **self.kwargs)
File "/home/dario/dev/python/prova/src/prova4.py", line 27, in add
cursor = db.cursor()
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140037302638336 and this is thread id 140037262886656
を唯一のカーソルの共有はしていませんより良い結果を得る:
conn = sqlite3.connect(':memory:')
qdb.put(conn.cursor())
私はキューを使ってスレッド間でデータベースを共有する方法を全く理解していない誰も助けてくれませんか? ありがとうございました!
2つのセント:Pythonでスレッドを使用せず、代わりにマルチプロセッシングを使用し、各プロセスで別々のデータベース接続を使用してください。 – James
ありがとう、私はマルチプロセッシングを見ていきますが、私はEliの答えで私のコメントを見ています。私は変更をコミットしたくないので、複数の接続を避けたいと思います。この状況でキューを使用することは本当に不可能ですか? – kynikos
'check_same_thread = False'でデータベースに接続すると、キューを使用していると危険ですか? – kynikos