为什么多进程不能通过even加速发送HTTP请求

2024-05-18 10:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序可以发送一堆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)

Tags: inimportsendurlfor进程maindef
1条回答
网友
1楼 · 发布于 2024-05-18 10:08:34

没有足够的信息。纯推测服务器是限制因素(这可能是有意的人为限制或资源不足造成的),因此,通过添加更多的并发请求,平均而言,您会使每个请求的速度变慢。在

这里有一种解释这个问题的方法:客户机和服务器上的资源都是有限的:每次CPU周期、每次内存访问、内存大小、网络带宽。OS和eventlet合理地利用了这些资源。这样你就可以估算出发出一个请求所需的资源量,软件将以一个合理的模式(接近线性)扩展它。要从多处理中获益,需要您的客户机进程使单个CPU单元100%繁忙。特别是requests库以擅长浪费硬件资源而闻名,在我尝试的所有方法中,它产生的CPU开销最多(httplib、httplib2、urllib)。但是你必须发出大量(数千)的并发请求,或者有一个非常糟糕/繁忙的CPU才能使它成为瓶颈。在

准确答案需要信息:

  • HTTP客户机和服务器对任何资源是否一致?一、 它们运行在相同的物理硬件上吗?在
  • 您在单进程模式下能够生成的最大请求频率(每秒计数)是多少?调整GreenPile大小以改变并发请求的数量。在
  • 使用多个进程生成的请求的最大频率是多少?调整绿堆大小和进程数量。尝试运行几个独立的Python解释器而不进行多处理。在
  • 服务器是瓶颈吗?通过在不同的硬件上添加另一个客户端来进行检查。如果请求频率较高,则服务器不是瓶颈。如果请求频率随着更多的客户机而下降,那么服务器已经在极限状态下运行,多处理只会使情况变得更糟。在
  • 什么是请求时间分布?请求在220/300/400/500/1000/毫秒以上完成的百分比是多少?在
  • 什么是网络延迟/带宽?请求/响应大小是多少?你会使网络饱和吗?在

回答这些问题将为您提供有关客户端/服务器内部和之间的出色直觉。在

相关Github问题:https://github.com/eventlet/eventlet/issues/195

相关问题 更多 >