专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

Python多进程和多线程是鸡肋嘛_CSS学习

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/4 2:31:54       共计:3590 浏览

Python多进程和多线程是鸡肋嘛?

什么是线程?你为什么想要它?

本质上,Python是一种线性语言,但是当您需要更多处理能力时,线程模块会派上用场。尽管Python中的线程不能用于并行CPU计算,但是它非常适合Web抓取之类的I / O操作,因为处理器处于空闲状态,等待数据。

线程改变了游戏规则,因为许多与网络/数据I / O相关的脚本花费了大部分时间来等待来自远程源的数据。因为可能未链接下载(即,抓取单独的网站),所以处理器可以并行地从不同的数据源下载并在最后合并结果。对于CPU密集型进程,使用线程模块几乎没有好处。

幸运的是,线程包含在标准库中:

您可以target用作可调用对象,args将参数传递给函数,并start启动线程。

如果您从未见过if __name__ == '__main__':,那么这基本上是一种确保嵌套在其中的代码仅在脚本直接运行(不导入)的情况下才能运行的方法。

您通常会希望您的线程能够使用或修改线程之间共有的变量,但为此您必须使用称为的东西lock。每当函数要修改变量时,它都会锁定该变量。当另一个函数要使用变量时,它必须等待直到该变量被解锁。

想象两个都将变量迭代1的函数。使用锁可以确保一个函数可以访问该变量,执行计算并写回该变量,然后另一个函数才能访问相同的变量。

使用线程模块时,在打印时也会发生这种情况,因为文本可能会变得混乱(并导致数据损坏)。您可以使用打印锁来确保一次只能打印一个线程。

在这里,我们有10个工作要做,还有5个将完成工作的工人。

多线程并不总是完美的解决方案

我发现许多指南倾向于忽略使用他们刚刚尝试教给您的工具的负面影响。重要的是要了解使用所有这些工具既有优点也有缺点。例如:

与管理线程相关的开销很大,因此您不想将其用于基本任务(例如示例);

增加了程序的复杂性,这会使调试更加困难。

什么是多进程?它与线程有何不同?

如果不进行多进程,由于GIL(全局解释器锁定),Python程序将无法最大化系统的规格。在设计Python时,并不是考虑到个人计算机可能具有多个内核(向您显示该语言的年代),因此GIL是必需的,因为Python不是线程安全的,并且在访问Python对象时存在全局强制的锁。尽管不是十全十美,但它是一种非常有效的内存管理机制。我们能做什么?

多处理允许您创建可以同时运行(绕过GIL)并使用整个CPU内核的程序。尽管它与线程库有根本的不同,但是语法非常相似。多重处理库为每个进程提供了自己的Python解释器,并为每个进程提供了自己的GIL。

因此,与线程相关的常见问题(例如数据损坏和死锁)不再是问题。由于进程不共享内存,因此它们不能同时修改相同的内存。

让我们开始吧:

如果您有共享数据库,则要确保在启动新进程之前等待相关进程完成。

如果要将参数传递给流程,可以使用args

这是一个简洁的示例,因为您会注意到,数字没有按您期望的顺序排列。

与线程处理一样,多进程仍有弊端……您必须选择它:

数据在进程之间随机移动会产生I / O开销整个内存被复制到每个子进程中,这对于更重要的程序可能会产生很多开销你应该用什么?

如果您的代码有很多I / O或网络使用情况:

多线程是您最好的选择,因为它的开销很低

如果您有GUI

多线程,因此您的UI线程不会被锁定

如果您的代码受CPU限制:

您应该使用多重处理(如果您的计算机具有多个内核)

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:新闻传播学可以调剂哪些学校_CSS学习 | ·下一条:css用于为页面添加动态效果的标签_CSS学习

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有