擅长:python、mysql、java
<p>Django的<code>save()</code>对GIL没有什么特别之处。事实上,在Python代码中,当GIL被执行时,几乎没有什么可以做的,线程必须保存GIL。在</p>
<p>只有两种方式可以释放GIL:</p>
<ul>
<li>Python决定切换线程(在<a href="http://docs.python.org/library/sys.html#sys.getcheckinterval" rel="noreferrer">^{<cd3>}</a>指令之后)</li>
<li>Django调用一个数据库接口例程,实现该例程来释放GIL</li>
</ul>
<p>第二点可能是您正在寻找的SQL <code>COMMIT</code>被执行,在执行期间,SQL后端发布GIL。然而,这取决于SQL接口,我不确定流行的接口是否真的发布了GIL*。在</p>
<p>而且,<code>save()</code>不仅仅运行几个<code>UPDATE/INSERT</code>语句和<code>COMMIT</code>;它在Python中做了大量的簿记工作,其中必须保存GIL。总之,我不确定将<code>save()</code>移动到另一个线程中是否会获得任何好处。在</p>
<hr/>
<p><strong>更新</strong>:通过查看源代码,我了解到<code>sqlite</code>模块和<code>psycopg</code>在调用数据库例程时都会释放GIL,我想其他接口也会这样做。在</p>