Python高并发爬虫测评(2): 多进程, 多线程和异步协程哪个快?

在探索Python同时高级考者的有效性时,我们在上一篇有关第二次手力信息的Lianjia Crawlers的文章中首次检查了同步Cower的性能,并要求HTTPX异步Choroutine的httpx异步Choroutine。
结果表明,异步合唱横梁的效率比同步轨道的效率要大得多。
但是,实施同时高级考者的方法不是个体。
多进程,多线程和异步合唱团可以显着提高爬虫工作的效率,但是哪种方法更有效?本文旨在评估这三种方法在实际应用中的性能差异。
在爬行者中获得了高竞争的三种主要策略:多纯,多线程和异步合唱团。
每种方法都有其自己的适用场景和效率特征。
与同步轨道相比,多计划和多线程通过进行平行活动来减少等待时间,从而提高了整体效率。
但是,在多个过程之间不共享内存,并且使用诸如Python多进程模块提供的工具(例如Manager.queue())需要数据同步。
多线程可以共享内存,但受Python中的GIL(全局互动锁)的限制,这会影响线程之间快速变化的效率。
为了直观地比较这三种方法的性能,我们使用HTTPX库来测试LIANJIA.com数据的多冲程和异步多冲程合唱团数据。
首先,传统的轨道python发生在一个过程中,并在线程中进行,并且请求被阻塞并浪费了很多等待时间。
异步合唱团的曲折使用事件循环有效地执行更多平行活动,从而显着提高效率。
随后,我们在异步合唱团的Cowler中转换了Cowler同步,并通过使用异步关键字包装扫描和分析过程来实现异步需求,并将HTTPX asyncclient结合在一起。
多平面库勒使用过程池同时管理更多的扫描活动,这与单个过程和单个线程相比大大减少了等待时间。
多线程攻击者也没有考虑GIL的影响力,也会获得高效的竞争。
测试结果表明,多进程搜寻器使用7 .6 秒,多锁栅栏仅需2 .2 秒,而异步的合图爬行者则需要2 .5 秒。
多线程和异步合唱在效率方面很接近,但是在实用应用中,多线程更为常见,因为它不受GIL的限制,并且可以更有效地创建线程之间的快速更改。
相反,多计划在共享数据方面面临着挑战,尽管异步合唱团有效,但在某些情况下,同步的爬网策略与多移移相结合可以更有利。
总而言之,多计划,多线程和异步合唱团可以有效提高Python横梁的工作效率。
但是,应根据实际需求和特定方案确定哪种选择方法。
多面板适用于数据共享较低并且需要数据隔离的方案,在过程中需要数据隔离,在共享内存中表现良好,而异步合唱团在计算机的高强度活动中特别有效。
在实际应用中,同步攻击器与跨线程相结合的策略有时可以达到效率令人满意。
对于特定选择,应考虑活动,系统资源和绩效要求的特征,做出最佳决策。

为什么在python里推荐使用多进程而不是多线程

在Python多线程中,每个线程的执行方法悬挂:1 获取GIL2 并执行代码睡觉或Python虚拟机将其悬挂。
3 释放吉尔可见。
如果线程想要执行,则必须首先获得GIL。
我们可以将吉尔视为“护照”,在python过程中,只有一个吉尔。
如果不允许无法获得护照的线程输入CPU进行执行。
在Python 2 .x中,GIL的解放逻辑是,当前线程符合IO操作,或者计数数量达到1 00(tick可以将其视为Python本身的计数器,尤其是GIL用于GIL,并在每次发布后重置为零。
可以通过SYS COMPLES COMPLION资源进行调整。
)。
2 io密集型代码(文件处理,网络crawler等),多读力可以有效提高效率(单个线程下的io操作将等待IO,这就是为什么Pythons Multithon的Multithon的多线程对IO密集型代码更友好的原因。
在Python3 .x中,吉尔语不使用吉尔语,gil not gil and gils gils the Enive the Excection the Itection。
仍然无法解决一个问题,即只能在GIL引起的同一时间执行线程,因此仍然无法满足效率。
但是,吉尔锁,因此可以无缝地进行。
这将导致步行和降低效率。
回到原来的问题:我们经常听到退伍军人说:“如果您想利用多核多核的CPU,请使用多核心。
”什么原因?原因是:每个过程都有自己的独立GIL,并且不会彼此干扰,因此可以真正平行地执行。
因此,在Python中,多过程的执行效率优于多线程(仅用于多核CPU)。
因此,这就是结论:使用更多的核心,如果您想提高并行的效率,则是使用多个过程的更通用的方法,可以有效地提高执行效率

Python的多进程、多线程、协程 —— join的用法

在讨论多进程,多纤维和Python的Cor You时,通常会忽略“ JOINS”的关键字。
首先,很明显,一个过程和线程之间的差异在于该过程将内存划分,而开始共享过程的内存。
Coroutines是最适合控制过程上下文的光线。
应用许多链时,“加入”用于等待线程完成执行。
通过比较代码的以下两个部分,您可以看到“ JOIN”的差异。
代码1 :线程认真执行,操作结果为1 6 秒。
代码2 :“加入”可确保执行所有链,但是实际的操作结果没有平行的效果,表明使用“ Union”。
“加入”功能的说明:在纱线的“联合”中执行代码时,将固定主纱线直到完成线程的执行。
因此,使用“加入”时,您必须选择最长执行时间的链,以减少不必要的“加入”集合。
“联合”的目的:在多线程尾声方案中,主要程序希望所有URL在执行数据处理之前爬网。
如果您不确定纱线执行排名,则可以合理地确保每个线程执行“ JOIN”。
后记:“联合”的正确含义和使用是多线程编程的关键,以确保程序的正确性和效率。

Python编程面试常见问题有哪些?

Python编程问题1 :Python中多领域的局限性以及在多个过程中传递参数的方式,以及Python中多线程的差异(1 )限制以及在多个过程中传递参数的方式。
Python多线程具有全局收费锁(全局解释锁)。
此锁意味着只有一个线程可以随时使用解释器。
这意味着使用单个CPU运行更多程序。
每个人都依次使用它。
这称为“并发”,而不是“并行”。
要在多个过程之间共享数据,您可以使用多处理。
价值和多处理。
阵列(2 )Python和多处理之间的差异。
在UNIX平台上,当一个过程完成后,该过程必须称为父母过程,否则该过程将是僵尸过程(Zombie)。
因此,有必要调用join(实际上等同于等待)的join(实际上等同)。
对于多线程,由于这只是一个过程,因此不存在此必需品。
更多流程应避免共享资源。
在多线程中,我们可以更轻松地共享资源,例如使用全局变量或传递参数。
当涉及几个过程时,由于每个过程都有自己的独立内存空间,因此上述方法不合适。
目前,我们可以通过共享记忆和领导方法共享资源。
但是这样做会增加程序的复杂性,并降低由于需要同步而降低程序的效率。
Python编程问题2 :Lambada功能Lambda功能是一个功能,可以接收所有更多参数(包括可选参数)并返回单个表达式值。
Lambda功能不能包含命令,并且不能包含一个以上的表达式。
不要尝试在Lambda功能中塞满太多东西;如果您需要更复杂的东西,则应定义一个正常功能,然后在需要的情况下进行。
编辑将继续更新有关Python编程技能,信息等的更多信息。