我有一个应用程序可以发送一堆HTTP请求。首先,我使用eventlet和请求来实现它。但性能太低了。因此,我希望使用多进程来加速它。需要知道的是,服务器需要花费200ms来处理单个请求(不包括网络传输)。在
但是,多进程比原始版本慢。我对这个结果感到很惊讶!为什么?在
以下所示的时间I>用于测量时间。在
import eventlet
eventlet.monkey_patch(all=False, socket=True)
import requests
URL = 'http://....'
def send():
pile = eventlet.GreenPile(20)
for x in xrange(100):
pile.spawn(requests.get, URL)
for x in pile:
pass
import multiprocessing
def main():
procs = [multiprocessing.Process(target=send) for _ in range(3)]
for p in procs:
p.start()
for p in procs:
p.join()
import timeit
if __name__ == '__main__':
print timeit.timeit(main, number=1)
没有足够的信息。纯推测服务器是限制因素(这可能是有意的人为限制或资源不足造成的),因此,通过添加更多的并发请求,平均而言,您会使每个请求的速度变慢。在
这里有一种解释这个问题的方法:客户机和服务器上的资源都是有限的:每次CPU周期、每次内存访问、内存大小、网络带宽。OS和eventlet合理地利用了这些资源。这样你就可以估算出发出一个请求所需的资源量,软件将以一个合理的模式(接近线性)扩展它。要从多处理中获益,需要您的客户机进程使单个CPU单元100%繁忙。特别是
requests
库以擅长浪费硬件资源而闻名,在我尝试的所有方法中,它产生的CPU开销最多(httplib、httplib2、urllib)。但是你必须发出大量(数千)的并发请求,或者有一个非常糟糕/繁忙的CPU才能使它成为瓶颈。在准确答案需要信息:
回答这些问题将为您提供有关客户端/服务器内部和之间的出色直觉。在
相关Github问题:https://github.com/eventlet/eventlet/issues/195
相关问题 更多 >
编程相关推荐