<blockquote>
<p>ProgrammingError: SQLite objects created in a thread can only be used in that same</p>
</blockquote>
<p>问题是由于某种原因,您试图保存光标。你不应该这样做。为每个事务创建一个新的游标;或者,如果您不完全确定事务的开始或结束位置,则为每个查询创建一个新的游标。在</p>
<pre><code>import sqlite3
class DB(object):
def __init__(self):
self.conn_uri = './data.sqlite'
[...]
def doSomething(self,Param):
conn = sqlite.connect(self.conn_uri)
c = conn.cursor()
c.execute("SELECT * FROM xyz WHERE ID = ?", Param)
</code></pre>
<p><strong>编辑、重新评论您的问题</strong>:这里发生的事情与python几乎没有关系。当您创建一个sqlite资源时,它是一个C库,完全独立于python,sqlite要求在创建它的线程中只使用<em>资源</em>。它通过查看当前正在运行的线程的线程ID来验证这一点,而不尝试协调从一个线程到另一个线程的资源传输。因此,您有义务在每个需要它们的线程中创建sqlite资源。在</p>
<p>在代码中,您将在<code>DB</code>对象的<code>__init__</code>方法中创建所有sqlite资源,该方法可能只调用一次,并在主线程中创建。因此,这些资源只允许在该线程中使用,<code>threading.Lock</code>尽管如此。在</p>
<p>您的问题:</p>
<blockquote>
<ul>
<li>Who owns the cursor object in this case? The Processing Thread or the DB thread?</li>
</ul>
</blockquote>
<p>创建它的线程。因为它看起来像是在模块级别调用<code>DB()</code>,所以它很可能是主线程。在</p>
<blockquote>
<ul>
<li>Where can I read up on this stuff to finally "get" it?</li>
</ul>
</blockquote>
<p>其实没什么好弄的。在幕后什么都没有发生,除了当您使用它时<a href="http://sqlite.org/threadsafe.html" rel="nofollow">SQLite has to say on the matter</a>什么。在</p>
<blockquote>
<ul>
<li>Is the term "Object ownership" even correct, or is there an other term for this in Python?</li>
</ul>
</blockquote>
<p>Python实际上与线程没有太多关系,只是它允许您使用线程。正确地协调多线程应用程序是你的责任。在</p>
<p>再次编辑:</p>
<p>对象不在特定线程内。当您调用对象上的方法时,该方法在调用线程中运行。十个线程可以在同一个对象上调用同一个方法;所有线程都将并发运行(或者传递给GIL的任何线程),并且由调用方或方法体来确保没有中断。在</p>