У меня есть следующая функция, которая выполняется 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)
происходят зеленые переключения, которыеоперация блокировки, пока сервер не вернет значение.Гринлет после переключения из контекста вернется в действие, когда другой сервер вернет ответ, и когда он получит шанс снова запустить.Таким образом, накладные расходы других гринлетов также добавляются до того, как вычисляется время окончания.
Итак, как правильно найти правильное время выполнения какой-либо части или полной функции, которая выполняется в гринлете?
Я также прошел этот пост: Почему количество гринлетов повлияет на истекшее время ответов