我有一个内置于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;尽管我要分担工作量,并且每个过程要做的工作要少得多,但与在一个过程中完成所有工作相比,与不使用多处理的情况相比,此工作量仍会花费更长的时间。
注意:由于回答此问题的任何人都无法访问代码。我试图提供有关此问题的尽可能多的信息。潜在的故障排除步骤也将不胜感激,因为如果不测试解决方案就很难解决问题