【问题标题】:Does `psycopg2` in Python 2.x block the GILPython 2.x 中的“psycopg2”是否会阻止 GIL
【发布时间】:2016-06-23 08:52:39
【问题描述】:

我正试图解决与同事的争吵。假设我有一个 Python 2.6 应用程序,它使用 psycopg2 与 Postgres 数据库通信。该应用程序是多线程的。当一个线程使用psycopg2 进行数据库调用时,它是否会释放 GIL 以便其他线程也可以进行数据库调用?

【问题讨论】:

标签: python postgresql gil


【解决方案1】:

快速浏览the Psycopg release notes,有很多关于发布 GIL 的参考。所以显然它会在适当的时候尝试释放 GIL。你没有问具体的场景,所以我认为不可能有更具体的答案。

【讨论】:

  • “特定场景” 只说最常见的数据库操作,从表中选择内容?
【解决方案2】:

正如您所说,存在一个规则,即只有获得 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 2018-03-29
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2016-04-15
    相关资源
    最近更新 更多