在python上,多处理要比单核慢

时间:2020-10-17 16:41:17

标签: python multithreading process multiprocessing

我有一个内置于python的专有网络库。它目前处于线程状态,但是我希望它具有更大的可扩展性,因此下一步是克服python的GIL。

但是,我在尝试实现此功能时遇到了一些问题。我没有做太多的多处理,但是我没想到结果会这么差,这使我相信我一定弄乱了一些东西。

这些结果是在i5-10300H(4C / 8T)CPU和8GB RAM上运行的,并针对本地Nginx服务器进行了测试

没有多重处理:

2000个请求= 1.4秒

现在可以进行多处理了

   Spawned Processes   Time Taken (s)

   1                   1.5
   2                   1.6
   3                   1.55
   4                   2.3
   6                   2.35
   8                   2.4

                 

我已经将相同的2000个请求分解为每个多处理测试的x个过程。同样重要的是要注意,计算时间从网络任务开始到网络任务结束之间开始。这样做是为了避免由产卵过程引起的开销

专有网络库的初始开销确实足以确认,并且经历了更多的请求/秒超时。但是,我认为这不会比没有多处理的速度慢。这是我使用的代码:

def stuffToExecute(something):
    with genericNetworkingLibrary(maxThreadNum=100) as TSN:
        start = time.time()
        for i in range(500):
            TSN.threadFastGetRequest("http://127.0.0.1")

    end = time.time()
    print(end-start)


if __name__ == "__main__":

    with multiprocessing.Pool(processes=4) as processPool:
        processPool.map(stuffToExecute, range(4))


我还尝试使用multiprocessing.Process(target=stuffToExecute args=(something,))对其进行多进程处理,以获取想要创建的进程数。然后,我尝试手动启动它们并等待它们完全执行,但是得到的结果与上述上下文管理器相同。

我在具有i7 4790k和24GB RAM的台式机上尝试了这些测试,尽管速度明显更快,但我仍然观察到相同的趋势,即执行更多的进程执行2000个请求/进程所花费的时间更长,因此花费的时间更长

TLDR;尽管我要分担工作量,并且每个过程要做的工作要少得多,但与在一个过程中完成所有工作相比,与不使用多处理的情况相比,此工作量仍会花费更长的时间。

注意:由于回答此问题的任何人都无法访问代码。我试图提供有关此问题的尽可能多的信息。潜在的故障排除步骤也将不胜感激,因为如果不测试解决方案就很难解决问题

0 个答案:

没有答案