Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python上,多处理比单核慢_Python_Multithreading_Process_Multiprocessing - Fatal编程技术网

在python上,多处理比单核慢

在python上,多处理比单核慢,python,multithreading,process,multiprocessing,Python,Multithreading,Process,Multiprocessing,我有一个用python构建的专有网络库。它目前是线程化的,但我希望它具有更大的可伸缩性潜力,因此下一步是克服python的GIL 然而,我在尝试实现这一点时遇到了一些问题。我没有做太多的多重处理,但我没想到结果会如此糟糕,这让我相信我一定是把事情搞砸了 这些结果在i5-10300H(4C/8T)CPU和8gbram上运行,并在本地Nginx服务器上进行了测试 没有多处理: Spawned Processes Time Taken (s) 1

我有一个用python构建的专有网络库。它目前是线程化的,但我希望它具有更大的可伸缩性潜力,因此下一步是克服python的GIL

然而,我在尝试实现这一点时遇到了一些问题。我没有做太多的多重处理,但我没想到结果会如此糟糕,这让我相信我一定是把事情搞砸了

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

没有多处理:

   Spawned Processes   Time Taken (s)

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

                 
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;即使我正在拆分工作负载,并且每个进程要做的工作更少,但与在一个进程上完成所有工作相比,这个工作负载仍然比我在不使用多处理的情况下完成工作所花费的时间更长


注意:由于回答此问题的任何人都无权访问代码。我试图提供尽可能多的信息来解决这个问题。可能的故障排除步骤也值得赞赏,因为如果不测试解决方案,就很难解决问题

哪个操作系统?Windows可能比linux/mac慢,因为需要生成新进程,导入模块,并在新进程中处理和扩展环境的快照。在创建池时,这是一次性的成本,但可能会带来大量开销,特别是如果您的模块在模块级做了大量工作(并且如果顶层脚本没有将其执行代码放入
if uuuuu name uuuuu==“uuuu main_uuuuu”
块中)。另一个杀手是有多少数据从父进程传递到子进程(然后又返回)对于每个任务。如果它太多,它可能会掩盖mp的好处。我在Windows10上运行这个。运行这些测试时,父进程和子进程之间没有传递数据。你提到的一次性费用没有计入我计算的时间。我所做的时间测量专门测量流程内运行网络工作负载所需的时间。它不包括流程创建开销