В 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
Это только особый случай, или грекстам на самом деле не нужно socket
исправление?
※ Я сделал это, так как хочу использовать Python nativeмногопроцессорность и совместная работа.