Сроки гринлетного исполнения - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующая функция, которая выполняется 100 гринлетами параллельно.

def func(a):
  arg = RpcArg(a=a)
  start = time.time()
  ret = rpc_client.Rpc(arg)
  finish = time.time()
  return (finish - start)

Rpc - это удаленный вызов процедуры для сервера.Цель состоит в том, чтобы рассчитать время, необходимое серверу для обработки Rpc.Запросы выполняются параллельно с использованием гринлетов с использованием следующего фрагмента кода:

def timer():
  threads = []
  for i in xrange(100):
    threads.append(gevent.spawn(func, a))
  gevent.joinall(threads)

Сервер может выполнить максимум 5 запросов параллельно.Время, затрачиваемое вызовом Rpc, как видно на сервере, значительно отличается от того, что сообщается с помощью приведенного выше сценария.

По моему мнению, проблема заключается в том, что после вызова rpc_client.Rpc(arg) происходят зеленые переключения, которыеоперация блокировки, пока сервер не вернет значение.Гринлет после переключения из контекста вернется в действие, когда другой сервер вернет ответ, и когда он получит шанс снова запустить.Таким образом, накладные расходы других гринлетов также добавляются до того, как вычисляется время окончания.

Итак, как правильно найти правильное время выполнения какой-либо части или полной функции, которая выполняется в гринлете?

Я также прошел этот пост: Почему количество гринлетов повлияет на истекшее время ответов

...