在https://github.com/kennethreitz/grequests/blob/master/grequests.py#L21中,他们进行猴子补丁,除了thread
和select
模块之外。
有人认为修补socket
模块是必要的(https://stackoverflow.com/a/14736846/4646963)。
但是,当我将猴子补丁修改为curious_george.patch_all(thread=False, select=False, socket=False)
时,原始选项的总耗时是相同的。
import time
url = 'https://upload.wikimedia.org/wikipedia/commons/d/d6/Wp-w4-big.jpg'
def foo():
import requests
a = time.time()
[requests.get(url) for _ in range(30)]
return (time.time() - a)
def bar():
# curious_george.patch_all(thread=False, select=False, socket=False)
from gg import get, map
a = time.time()
rs = map([get(url) for _ in range(30)])
return (time.time() - a)
def bar2():
# curious_george.patch_all(thread=False, select=False)
from ggg import get, map
a = time.time()
rs = map([get(url) for _ in range(30)])
return (time.time() - a)
def bar3():
from grequests import get, map
a = time.time()
rs = map([get(url) for _ in range(30)])
return (time.time() - a)
def main():
import sys
if sys.argv[1] == 'foo':
print('foo', foo())
elif sys.argv[1] == 'bar':
print('bar', bar())
elif sys.argv[1] == 'bar2':
print('bar2', bar2())
elif sys.argv[1] == 'bar3':
print('bar3', bar3())
return
if __name__ == '__main__':
main()
上面的代码的结果如下所示,禁用socket
猴子补丁不会影响效率。
$ python test.py bar3; python test.py foo; python test.py bar; python test.py bar2;
bar3 32.054755449295044
foo 62.988484621047974
bar 33.472841024398804
bar2 31.087408304214478
这是仅是一种特殊情况还是grequest实际上是否不需要socket
修补?
※之所以这样做,是因为我想同时使用python本地多处理和grequests。