访问修补的python模块的原始版本

时间:2018-07-24 23:27:04

标签: python python-multiprocessing gevent monkeypatching locust

我正在使用Locust框架对系统进行负载测试。我的项目包含Locust源文件(未列出为依赖项),因为我必须对源代码进行一些必要功能的修改。不幸的是,在蝗虫/核​​心中,以下代码被称为

from gevent import GreenletExit, monkey
from six.moves import xrange
monkey.patch_all()

在项目的其他部分(蝗虫以外-但仍依赖于蝗虫的本地修改版本),我尝试使用多处理模块:

from multiprocessing import Pool

def dummy_func
pool = Pool(4) #gets hung up here -- likly because of patched sockets in os module
results = pool.map(irrelevant_func, irrelevant_data)

问题是 monkey.patch_all()修补了 multiprocessing 模块依赖项(例如os模块),使其无法使用。我无法删除对Locust必需的monkey.patch_all()调用,但是我需要访问多处理模块的原始版本(及其所有依赖项),以便保留其功能。

TLDR:Gevent的MonkeyPatching导致Multiprocessing Pool挂起(不会初始化),因为它修补了os模块套接字-我如何获得访问未打补丁的os模块的Multiprocessing版本以及访问已打补丁的os的gevent版本模块

我对类似错误的研究

  1. Python unit test best practice to avoid monkey patching bug
  2. Gevent monkeypatching breaking multiprocessing
  3. https://groups.google.com/forum/#!topic/gevent/Mjk3qc0i13E

0 个答案:

没有答案