如何解决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 举报,一经查实,本站将立刻删除。