我有以下功能,由100个greenlet并行执行。
def func(a):
arg = RpcArg(a=a)
start = time.time()
ret = rpc_client.Rpc(arg)
finish = time.time()
return (finish - start)
Rpc
是对服务器的远程过程调用。目的是计算服务器处理Rpc所花费的时间。使用以下代码段,使用greenlets并行触发请求:
def timer():
threads = []
for i in xrange(100):
threads.append(gevent.spawn(func, a))
gevent.joinall(threads)
服务器最多可以并行执行5个请求。在服务器上看到的Rpc调用所花费的时间与上述脚本报告的时间明显不同。
根据我的说法,问题是由于在调用rpc_client.Rpc(arg)
之后发生绿键切换,这阻塞了操作直到服务器返回值。当其他服务器返回响应并且返回时,重新运行的greenlet将重新生效。因此,在计算完成时间之前,还会增加其他greenlet的开销。
那么,找到在Greenlet中运行的部分或全部功能所花费的正确执行时间的正确方法是什么?
我也浏览了这篇文章:Why the amount of greenlets will impact the elapsed time of the responses