首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IO绑定任务多线程和CPU绑定任务多处理

IO绑定任务多线程和CPU绑定任务多处理
EN

Stack Overflow用户
提问于 2020-03-03 18:23:16
回答 1查看 3.6K关注 0票数 4

https://realpython.com/async-io-python/介绍了多线程和多线程处理,但它没有说明什么是一般有效的,还是只在Python环境中有效。例如,它说:

并发性既包括多处理(适合于CPU绑定任务),也包括线程(适合于IO绑定任务)。

以前,我已经用其他编程语言(如C/C++ )开发了并发应用程序,这句话对我来说似乎很奇怪。为什么多线程一般不适合于CPU绑定任务和IO绑定任务的多处理?AFAIK和AFAIK都可以有效地用于这两项任务。两者之间的决定取决于其他条件,例如任务粒度、共享状态的数量和任务之间的执行顺序依赖,以及进程/线程创建成本(对于进程来说,特别是在某些OSes中)。上面的语句是否特定于Python环境及其全局锁解释器限制?

EN

回答 1

Stack Overflow用户

发布于 2020-03-05 16:19:07

正如Go语言的共同发明者Rob所说:

  • 并发就是一次处理很多事情。
  • 并行就是一次做很多事情。
  • 不是一样的而是相关的。
  • 一个是关于结构,一个是关于执行。
  • 并发性提供了一种构造解决方案以解决可能(但不一定)可并行的问题的方法。

来自卢西亚诺拉马略的书,“流利的Python”第18章,第557页。

他们想说的是,当您确实需要多个CPU绑定任务或并行任务时,多处理(它也是Python中用于并行化的库的名称)是解决问题的方法。在Python中,这是通过使用例如Python多处理模块绕过GIL来实现的。

在Python中,有一种叫做GIL的东西,当时只允许运行一个线程。您需要绕过GIL来使用并行性。同时,即使有GIL限制,您也可以实现并发:一次只能运行一个线程!!

在Python中,您可以通过以下方式实现并发:

  • 线,
  • 期货(以线为基础)
  • 和异步I/O (不是基于线程的,而是事件循环和协作多任务)

因此,如您所见,您有3种并发方式,但由于GIL的限制,您不能在并行任务或CPU绑定任务中使用它。

我找到了一篇可以帮助您处理并发性和异步I/O的文章。

Python中具有异步I/O的并发性

要在Python中实现并行性,您需要绕过GIL。一个帮助实现这个功能的python模块称为“多处理”。

关于你的怀疑:

.(它说多处理是CPU绑定任务的理想选择,多线程是IO绑定任务的理想选择)只适用于Python环境。

我不能说它是否只适用于Python,因为我不知道其他语言,但例如,Javascript因其异步I/O方法而臭名昭著,同时C#、C++、Java实现了并发性和并行性,没有任何不便或限制使用线程。C#作为JavaScript很久以前也实现了异步I/O。

大卫比兹利和ŁBeazley Langa在下面的会谈中都提到了这一事实。

  • ,巴西PyCon 2015年主题演讲
  • David Beazley,Coroutines和并发的好奇课程
  • PyCon 2016Łukasz Langa,Coroutines中的思考

链接也在下面的演示文稿中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60513406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档