Прежде всего, я понятия не имею, является ли термин "Владение" правильным термином для этого, это просто то, что я называю в Java.
В настоящее время я создаю сервер, который использует SQLite, и я сталкиваюсь с ошибками, касающимися «владения» объектом:
У меня есть один модуль, который управляет базой данных SQLite. Давайте назовем это «pyDB». Упрощенная:
import threading
import sqlite3
class DB(object):
def __init__(self):
self.lockDB = threading.Lock()
self.conn = sqlite3.connect('./data.sqlite')
self.c = self.conn.cursor()
[...]
def doSomething(self,Param):
with self.lockDB:
self.c.execute("SELECT * FROM xyz WHERE ID = ?", Param)
(Обратите внимание, что объект lockDB
существует, потому что Database-Class может вызываться несколькими параллельными потоками, и, хотя сам SQLite является поточно-ориентированным, насколько мне известно, cursor
-Object нет) .
Тогда у меня есть рабочий поток, который обрабатывает вещи.
import pyDB
self.DB = pyDB.DB()
class Thread(threading.Thread):
[omitting some stuff that is not relevant here]
def doSomethingElse(self, Param):
DB.doSomething(Param)
Если я выполняю это, я получаю следующее исключение:
self.process(task)
File "[removed]/ProcessingThread.py", line 67, in process
DB.doSomething(Param)
File "[removed]/pyDB.py", line 101, in doSomething
self.c.execute(self,"SELECT * FROM xyz WHERE ID = ?", Param)
ProgrammingError: SQLite objects created in a thread can only be used in that same
thread.The object was created in thread id 1073867776 and this is thread id 1106953360
Теперь, насколько я понимаю, это та же самая проблема, с которой я столкнулся ранее (где владение объектом было дано не инициализированному классу, а тому, который его вызвал. Или я так понимаю это), и это привело меня к окончательному признанию, что я вообще не понимаю, как работает владение объектами в Python Я нашел документацию по Python для понятного объяснения, но не нашел ни одного.
Итак, мои вопросы:
- Кому принадлежит объект курсора в этом случае? Поток обработки или поток БД?
- Где я могу прочитать об этом материале, чтобы, наконец, "получить" его?
- Является ли термин "объект владение " даже правильным, или есть другой термин для этого в Python? (Изменить: Для объяснения этого см. Комментарии к основному вопросу)
Я буду рад получить конкретный совет для этого случая, но, как правило, меня больше интересует вся концепция "что принадлежит кому" в Python, потому что мне кажется, что это довольно сильно отличается от того, как Java это обрабатывает, и так как Я планирую много использовать Python в будущем, я мог бы просто изучить его сейчас, так как это довольно важная часть Python.