Проблемы масштабирования с использованием gevent и grpc - PullRequest
0 голосов
/ 24 июня 2018

Поскольку проблема совместимости gevent / grpc была исправлена, я пытался ее использовать.

Я протестировал ее с помощью образца сценария

from gevent import monkey
monkey.patch_all()

import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()

import grpc
import time
import sys

channel = grpc.insecure_channel('localhost:5000')
stub =hello_word_pb2_grpc.HelloWordStub(channel)

data = hellow_word_pb2.HelloWorld()

num_requests=3000
start=time.time()
futures = []

# Make async requests
for i in range (num_requests):
  futures.append(stub.HelloWorld.future(req))

# Wait for the requests to complete
for i in range (num_requests):
  try:
    result = futures[i].result()
    # Do something with the result
  except Exception as e:
    print(e)
end = time.time()
print(end - start)

Теперь без этого патча

import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()

требуется 0,456701040268 секунд, чтобы завершить 3000 запросов

Теперь с патчем

import grpc._cython.cygrpc
grpc._cython.cygrpc.init_grpc_gevent()

требуется 1,06 секунды.

Любые предложения, что может пойтичто-то не так с патчем совместимости.

Очевидно, что если я уменьшу количество запросов до 1000 и сделаю 3 вызова с 1000 асинхронными запросами в каждом вызове, то время, необходимое для общего количества 3000 запросов, будет меньше, чем 1,06.Но я хотел знать, что заставляет исправление делать это так медленно?

Я нашел нечто подобное, упомянутое здесь - https://github.com/grpc/grpc/blob/master/src/python/grpcio_tests/commands.py#L115

Это связано?

1 Ответ

0 голосов
/ 27 июня 2018

В стандартной реализации Python gRPC асинхронные запросы выполняются в фоновых потоках. Программы на чистом Python не могут получить параллелизм для задач, связанных с процессором, из-за GIL, но поскольку gRPC является библиотекой на основе c, большая часть работы с gRPC может выполняться одновременно.

Включение gEvent заставляет всю программу работать в одном потоке. Вы теряете параллелизм, упомянутый выше. Кроме того, есть некоторые издержки при обработке ввода-вывода в Python, в отличие от c.

Если ваша цель - максимизировать производительность, я бы рекомендовал использовать стандартную реализацию gRPC. gRPC gEvent в первую очередь предназначен для совместимости.

...