Web搜寻器:py中的协程vs线程vs进程

问题描述

目标是构建高性能的搜寻器。作为原型,我选择了1000台主机SSH并获取一些数据。我试图比较python中的以下方法

1。协程单线程

在这方法中,我有一个异步函数,该函数负责异步地将其切入单个主机,然后异步地从中获取数据。 ssh的超时为5s,数据获取的超时为10s。一次创建1000个协程,并调用asyncio.wait。令人惊讶的是,许多主机的ssh超时。这使我相信,一旦调用asyncio.wait,所有协程都会启动计时器,但是线程没有获得足够的cpu时间,因此许多ssh操作只是超时。我的假设正确吗?这导致了多线程方法

2。多线程

具有1个线程的1500个线程的单个线程池被初始化。然后,一次将1000个任务(负责ssh到单个主机中并下载小数据)全部提交到线程池。这比第一种方法要好得多,大约需要20秒才能完成。我看到线程的启动时间差异高达10秒,即使它们是一起提交的。这可能是由于单个内核上的线程调度(由于python的GIL导致cpu饥饿)或网络瓶颈。我不确定如何验证这一点。任何有关为什么首先启动的线程的执行开始时间与最后启动的线程的执行开始时间之间有10秒的差异的指针将很有帮助。

3。多个过程

我还没有尝试过,但是我正在考虑创建1500个进程而不是线程。如果瓶颈确实是由于GIL引起的,那么我应该看到速度有所提高。如果受网络限制,我无能为力。

如果我有任何遗漏,请告诉我。我想在一台机器上实现最短的端到端时间。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)