我试图与同事解决争执。假设我有一个使用psycopg2
与Postgres数据库通信的Python 2.6应用程序。该应用程序是多线程的。当一个线程使用psycopg2
进行数据库调用时,是否会释放GIL,以便其他线程也可以进行数据库调用?
答案 0 :(得分:2)
从the Psycopg release notes快速浏览一下,有很多关于发布GIL的内容。显然它试图在适当时释放GIL。你没有询问具体情况,所以我认为不可能有更具体的答案。
答案 1 :(得分:0)
正如您所说,存在一条规则,即只有获取GIL的线程可以在Python对象上运行或调用Python / C API函数。为了模拟执行的并发性,Python解释器会定期尝试切换线程。锁也会在读取或写入文件等潜在阻塞I / O操作时释放,以便其他Python线程可以同时运行。
操纵GIL的大多数扩展代码(包括psycopg2的代码)具有以下简单结构:
Save the thread state in a local variable.
Release the global interpreter lock.
... Do some blocking I/O operation ...
Reacquire the global interpreter lock.
Restore the thread state from the local variable.
这意味着当发生阻塞I / O操作(例如等待来自Postgres的网络响应)时,GIL将被释放,其他线程可以继续执行。阻塞I / O操作完成后,线程会尝试获取GIL,并在最终获取GIL时继续执行(处理结果等)。
看看psycopg2的实现here。