python 线程是如何工作的?

2024-05-05

我想知道 python 线程是并发运行还是并行运行?

例如,如果我有两个任务并在两个线程中运行它们,它们是同时运行还是计划同时运行?

我知道GIL并且线程仅使用一个 CPU 核心。


这是一个复杂的问题,需要大量解释。我将坚持使用 CPython,只是因为它是使用最广泛的并且是我有经验的。

  • Python 线程是一个system需要 Python 解释器在运行时将其内容本地执行为字节码的线程。 GIL 是一个特定于解释器(在本例中为 CPython)的锁,它强制每个线程acquire解释器上的锁,防止两个线程同时运行,无论它们位于哪个核心。

  • NoCPU 核心一次可以运行多个线程。你need多核甚至可以明智地谈论并行性。并发与并行不同 - 前者意味着两个线程之间的操作可以在任一线程完成之前交错,但两个线程不需要同时启动,而后者意味着可以在两个线程完成之前交错操作。started同时。如果这让您感到困惑,关于差异的更好描述是here https://stackoverflow.com/questions/1050222/concurrency-vs-parallelism-what-is-the-difference.

  • 有多种方法可以在单核 CPU 中引入并发性 - 即让线程挂起(使自己进入睡眠状态)并在需要时恢复 - 但有no引入单核并行性的方法。

由于这些事实,因此,这取决于情况。

  • 系统线程本质上被设计为并发的——否则操作系统就没有意义了。它们是否实际上以这种方式执行取决于任务:某处是否存在原子锁? (正如我们将看到的,确实存在!)

  • 执行受 CPU 限制的计算的线程(其中正在执行大量代码,并且同时为每行动态调用解释器)获得 GIL 上的锁,以防止其他线程执行相同的操作。所以,在that在这种情况下,所有核心一次只有一个线程工作,因为没有其他线程可以获取解释器。

    话虽这么说,线程don't需要保留 GIL 直到它们完成,而不是根据需要获取和释放锁。两个线程可以交错操作,因为 GIL 可以在代码块末尾释放,被另一个线程抓住,在代码块末尾释放。that代码块等等。他们不会跑进来parallel- 但它们当然可以同时运行。

  • 另一方面,I/O 绑定线程花费大量时间只是等待请求完成。这些线程不会获取 GIL - 当没有什么可以解释时,为什么它们会获取 GIL? - 所以当然可以让多个 I/O 等待线程并行运行,每个线程一个核心。然而,分钟代码需要编译为字节码(也许您需要处理您的请求?)GIL 再次上升。

  • Python 中的进程在 GIL 中幸存下来,因为它们是与线程捆绑在一起的资源集合。每个过程都有其own解释器,因此每个thread一个进程只需与它自己的直接兄弟进程竞争 GIL。这就是为什么基于进程的并行性是 Python 中推荐的方法,尽管它总体上消耗更多的资源。

结果

所以两个线程中有两个任务could run in parallel前提是他们不需要访问 CPython 解释器。如果它们正在等待 I/O 请求或正在使用不需要 Python 解释器的合适的其他语言(例如 C)扩展,使用外部函数接口,则可能会发生这种情况。

所有线程都可以运行同时在交错原子操作的意义上。究竟如何atomic这些交错可以是 - GIL 是否在代码块之后被释放?每行之后? - 取决于任务和线程。 Python 线程不必串行执行——一个线程完成,然后另一个线程开始——因此从这个意义上讲,存在并发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 线程是如何工作的? 的相关文章

随机推荐

  • 全局主题目录的 iis 快速路径

    我正在使用 Visual Studio 2010 SP1 ASP NET Webforms Framework NET 3 5 和IIS 快递 也称为 WebMatrix 我在 Visual Studio 中使用我的网站收到以下编译错误 T
  • 当模式在范围内时使用 sed 打印范围?

    我有一个充满查询的日志文件 我只想查看有错误的查询 日志条目类似于 path to file executing query QUERY SIZE ROWS MSG DURATION 我想打印所有这些东西 但只有当MSG 包含一些有趣的内容
  • 在 C# 整数运算中,a/b/c 是否始终等于 a/(b*c)?

    设a b和c为非大正整数 对于 C 整数算术 a b c 是否始终等于 a b c 对我来说 在 C 中它看起来像 int a 5126 b 76 c 14 int x1 a b c int x2 a b c 所以我的问题是 x1 x2对于
  • GWT 和 Web 服务 (wsdl)

    谁能告诉我一种从 GWT 客户端访问 WSDL Web 服务的方法 这可能吗 Thanks 智能网关 http www smartclient com product index jsp支持 WSDL 数据源 除此之外 您始终可以将 WSD
  • JavaScript 和数据库连接

    javascript可以直接访问数据库吗 我觉得我的问题是反问 因为这是一个安全问题 但这有可能吗 有可能的 有了新的html5功能 js可以通过WebSql连接 一个活生生的例子 http html5demos com database
  • 仅打印 drupal field_view_field 值

    我使用下面的代码将节点字段打印到特定区域 效果很好 但有一个例子 我只想打印没有标签的字段值 看起来应该很容易 但我遇到了一些麻烦 我很感激任何帮助 因为我对 drupal 还很陌生 谢谢 field view value 需要一个 dis
  • c# 如何在注册表中写入十六进制值,而不是十进制值?

    如何在注册表中写入 DWORD 十六进制值 而不是像此代码示例中那样的十进制值 RegistryKey key Registry LocalMachine key klase CreateSubKey SYSTEM CurrentContr
  • 是使用多个数据库各有一个架构更好,还是一个数据库有多个架构更好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 After 这条评论 https stackoverflow com questions 1130555 postgresql pitr bac
  • 如何使用 django-haystack 和 elasticsearch 后端进行模糊搜索?

    看起来好像elasticsearch支持模糊查询 http www elasticsearch org guide reference query dsl fuzzy query http www elasticsearch org gui
  • 使用 TFS 2010 的团队是否需要 Active Directory?

    我是 TFS 2010 的新手 希望在一个由 2 3 名远程人员组成的团队的小型项目中公平地尝试一下 是否要求我的所有团队用户都属于 Active Directory 网络设置 或者我可以让我的团队成员松散耦合并能够使用用户名 密码登录吗
  • Android SDK 缺少命令行工具

    我已经安装了flutter但当我跑步时flutter doctor为了验证安装 我得到 Android SDK is missing command line tools 我已经仔细检查了命令行是否已安装 我需要做什么才能消除此错误 我已经
  • 垂直滚动不适用于 Mobile Safari

    由于某些原因 当我在移动 Safari iOS 9 1 iPhone 5 Safari 8 1 上访问我的网站时 垂直滚动无法正常工作 https sleepy anchorage 3222 herokuapp com https slee
  • Google BigQuery:检索每行的最后版本

    我有一个 Google BigQuery 表 其中包含所有版本的资源 每次创建 更新 删除资源时 都会添加一个新行 并递增版本号 该数字将是添加行时的时间戳 ID ResourceID Action Count Timestamp ABC
  • 使用节点http代理转发http代理

    我正在使用 node http proxy 库来创建转发代理服务器 我最终计划使用一些中间件来动态修改 html 代码 这就是我的代理服务器代码的样子 var httpProxy require http proxy httpProxy c
  • 没有 OutputInterface 的 Symfony2 控制台输出

    我正在尝试使用 Symfony 控制台命令将一些信息打印到控制台 通常你会做这样的事情 protected function execute InputInterface input OutputInterface output name
  • 嵌入式+实时开发培训的建议[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在学习嵌入式实时工程职业 但发现找到好的培训材料有些困难 特别是因为您无法像桌面应用程序开发那
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • 如何在 Facebook 中嵌入 iframe?

    我的一位同事为我们工作的公司维护着一个 Facebook 页面 该公司希望在他们的 Facebook 上放置一个小部件 以允许用户输入他们的电子邮件并订阅我们的时事通讯 做 Facebook 的同事不是程序员 所以他让我做一些东西 我制作了
  • jQuery 动画 .prepend

    我不想简单地将 HTML 转储到我希望其动画的页面中 而是如何将下面的 jQuery 更改为插入 HTML 时动画或向下滑动 button click function j tweets ul prepend j refreshMe ul
  • python 线程是如何工作的?

    我想知道 python 线程是并发运行还是并行运行 例如 如果我有两个任务并在两个线程中运行它们 它们是同时运行还是计划同时运行 我知道GIL并且线程仅使用一个 CPU 核心 这是一个复杂的问题 需要大量解释 我将坚持使用 CPython