python gevent 库的 monkeypatching 是什么?

What is monkeypatching with the python gevent library?

我正在通读 http://sdiehl.github.io/gevent-tutorial/。在页面底部的示例中,我看到:

import gevent.monkey
gevent.monkey.patch_socket()

我读过 What is a monkey patch? ,其中对猴子修补进行了一般性讨论,但我不明白为什么猴子修补被 gevent 引用。

Gevent 是一个协作式多任务库。它的工作方式是你,程序员,将你的代码组织成称为 greenlets 的工作单元。虽然给定的 greenlet 是 运行ning,但它是单独的 运行。当它到达会阻塞的点时,也就是说,它必须等待一些外部信号,如文件、超时、我们的网络数据,greenlet 应该 cooperate 通过向 gevent 发出信号,谁安排了一些其他小绿地到 运行。一旦它等待的数据准备就绪,就会恢复以前的绿色。 (这是它的蜡笔色要点,可能有一些复杂性对您有用,让您知道这超出了这个答案的范围。)

现在,Python 的标准库(曾经?)不合作。标准行为不是向 gevent 发出某个 greenlet 可以暂停的信号,而是自私地阻止。这导致了一个问题,因为只有第一个 greenlet 运行ning:其他的永远没有机会被安排。

输入金钱补丁。 monkey.patch 的要点是用协作替代方案替换 stdlib 中的阻塞调用,以便现有代码可以利用 greenlets 的并发性而无需重写。