返回顶部
首页 > 资讯 > 后端开发 > Python >Python线程和锁是什么
  • 258
分享到

Python线程和锁是什么

2023-06-16 21:06:45 258人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“python线程和锁是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python线程和锁是什么”吧!概述线程和锁是硬件底层的软件定义形式化,因此包含最简单的可能并发模型。它

本篇内容主要讲解“python线程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Python线程和锁是什么”吧!

概述

线程和锁是硬件底层的软件定义形式化,因此包含最简单的可能并发模型。它构成了其他构建在其顶层的并发抽象基础,因此理解这一点很重要。然而,直接在这些基础上构建可靠,可扩展的系统是很困难的或着说是不可能的。

虽然大多数语言都支持线程和锁,但CPython仍然使用全局解释器锁来防止线程同时访问共享内存,因为CPython的内存管理是非线程安全的。虽然阻塞操作发生在GIL之外并且可能提高性能,但是线程切换所需的系统调用开销可能会降低性能。这意味着Python中的线程主要用于I/O受限的场景,而不是CPU受限的场景。

说句题外话,我提到了CPython,因为Python规范的其他部分实现,例如Jython,没有全局解释器锁。然而,这些实现在实践中并没有被广泛使用,因为***:没有人想要支持多Python实现,除非他们不得不这样;第二:它们还不够丰富;第三:由于需要原生支持C/C++扩展api,Python语言定义与C/c++紧密耦合,与其说是技术规范不如说是一个参考实现。

Python通过高级模块threading模块和低级模块_thread直接支持线程。想要获得更多有关这些模块如何工作的信息,可以在线获取源代码。

入门

Python中典型的单线程“Hello World”执行非常简单:

Python线程和锁是什么

多线程模拟并没有太大的不同:

Python线程和锁是什么

基于我有限数量的测试,上面的脚本运行结果如下所示:

Python线程和锁是什么

我用了get_ident()打印“线程标识符”(一个魔法值,除了在运行时消除不同线程之间的歧义之外,没有任何意义)。你可以看到在某些情况下,线程标识符是如何不同的,而在其他一些情况下,线程标识符又是相同的。相同的线程标识符并不意味着仍工作在同一个线程上,但如果工作不重叠并且不需要不同的线程标识符,Python会重新使用该标识符。

陷阱:时序性和一致性

如果你用threading.current_thread().getName()将线程标识符与线程名交换,你可能会获得有序结果,很大的原因可能是因为每个线程使用相同的函数和源码路径,因此,每个线程之间的延迟差异是微不足道的,仅次于解释器的延迟。然而,这并不意味着有序执行能够得到保证;这是WikiBooks上“Python  Programming”的一个例子,其中每个线程的创建和每个线程的执行具有明显不同的时序性:

Python线程和锁是什么

以下结果是同一个样本运行的输出:

Python线程和锁是什么

日志表示线程创建/执行是交错的。由于增加功能的可变性增加,随着线程创建和执行之间的时序越来越不一致,这些结果将变得越来越不可预测。但原理仍然是相同的;使用多个线程时无法保证一致的行为。

陷阱:访问共享内存

当不同的线程访问共享内存时,这可能导致不正确的行为。你可以扩展此示例以在使用多个线程进行计数时查看竞争条件:

Python线程和锁是什么

这会在一次示例运行时生成如下输出:

Python线程和锁是什么

此结果因创建的线程数而异,但你可以看到结果28与预期值100有多大区别。Counter().count是非线程安全的,在这里进行了演示(如果你有与我不同的机器,你可能会得到与28不同的结果)。如果遇到竞争条件,没有足够的日志记录,可能很难找到相关的代码部分。

陷阱:死锁

当两个代理尝试获取共享内存的相同区域时,最终就会发生死锁。当在处理线程和锁的低级抽象时,唯一的解决方案是确保每个代理有一种方法能正确地管理其锁,或者具有锁协调的整体规范。例如,用餐哲学问题强调了流程同步的重要性。Rosetta  Code的用餐哲学python解决方案解决了这个同步问题:如果你(代理)不能及时获取这两个分叉,你可以释放你已经拥有的任何叉子,以便另一个代理可以同时获得这两个叉子。

Python线程和锁是什么

此方法不排除其他锁定方法,像锁定顺序,或涉及流程同步的系统设计,像使用信号量的生产者-消费者模型,但在Python中可能不如在其他语言中普遍。

陷阱:异形方法和依赖关系

如果要在Python应用程序中应用多线程,那么你希望保证整个堆栈的正确性,你必须手动验证核实线程安全性和依赖项的线程模型。有些为企业级多服务环境使用而设计的依赖项,例如redis,可以在设计阶段首先考虑它们的并发模型(请参阅黑客新闻antirez关于多线程版本Redis的评论)。有些依赖可能不会;使用boto2时,并行使用multiprocessing.pool.Pool从S3并行下载文件时,我可能遇到了死锁,这需要重写一个函数。因此,另一个依赖性的困难出现了;它们无法被同化,这意味着如果你在你的应用使用依赖模型之前没有验证所有将使用的依赖关系,那么在尝试为特定用途添加依赖项时,你可能陷入项目的死胡同。

多线程日志记录

如果你选择使用Python中的原生线程模型,你可能会惊喜地发现logging模块不仅是线程安全的,而且还支持从任何特定线程或进程进行日志记录(示例在logging手册)。然后,难点是在你的应用程序中哪里更可能触发异常,这如何影响你的线程模型以及确保在这些代码段周围进行可靠的日志记录。将日志添加到你的应用可能会产生不小的延迟,正如pylint通过警告模块logging-lazy-interpolation通知你那样,这也可能会给你的线程模型带来困难。

concurrent.futures

在撰写这篇文章时发现Python

multiprocessing.pool.ThreadPool实现从未被记录或测试过,因为它从未完成,这让我感觉非常不愉快。它在python3.7中仍然还是这样,因为它出现在GitHub镜像的源代码中。鉴于全局解释器锁的无所不在,以及未来并发程序主要是并行I/O相关的工作,使用Python3.x中提供的像concurrent.futures.Executor或类似的新异步模式可能更有意义,因为他们更全面。我没有使用过这个模块,但我想与multiprocessing相比,它不会产生显着的性能损耗。

到此,相信大家对“Python线程和锁是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Python线程和锁是什么

本文链接: https://lsjlt.com/news/285515.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python线程和锁是什么
    本篇内容主要讲解“Python线程和锁是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python线程和锁是什么”吧!概述线程和锁是硬件底层的软件定义形式化,因此包含最简单的可能并发模型。它...
    99+
    2023-06-16
  • python线程锁的用法是什么
    在Python中,线程锁是一种同步原语,用于控制多个线程对共享资源的访问。线程锁的主要目的是确保在任何给定的时刻只有一个线程可以访问...
    99+
    2023-10-23
    python
  • python线程锁和全局锁有什么作用
    Python线程锁和全局锁都是用来控制多线程并发访问共享资源的工具,可以确保线程安全地访问共享资源。 线程锁是在代码块中使用的锁,它...
    99+
    2024-03-15
    python
  • # Python 多线程和锁
    作者博客:http://zzir.cn/ 进程和线程 进程是执行中的计算机程序。每个进程都拥有自己的地址空间、内存、数据栈及其它的辅助数据。操作系统管理着所有的进程,并为这些进程合理分配时间。进程可以通过派生新的进程来执行其它任务,不过...
    99+
    2023-01-31
    多线程 Python
  • Python线程安全锁的作用是什么
    Python线程安全锁的主要作用是保护共享资源的访问,以防止多个线程同时访问和修改共享资源导致的数据不一致或错误。 在多线程环境中,...
    99+
    2023-10-23
    Python
  • Python线程锁
    多线程的优势:可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!so,不使用线程锁, 可能导致错误购买车票--线程锁[root@~]# cat test.py #-*- coding:utf-8 -*- i...
    99+
    2023-01-31
    线程 Python
  • Python进程和线程的概念是什么
    这篇文章主要介绍“Python进程和线程的概念是什么”,在日常操作中,相信很多人在Python进程和线程的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python进程和线程的概念是什么”的疑惑有所...
    99+
    2023-06-02
  • java中线程锁死指的是什么
    这篇文章主要介绍java中线程锁死指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、说明线程锁死是指等待线程由于唤醒其所需的条件永远无法成立,或者其他线程无法唤醒这个线程而一直处于非运行状态(线程并未终止)...
    99+
    2023-06-15
  • Python多线程编程,线程锁
    多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!!   什么是线程? 线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。 线程又被称为轻量级进程 ...
    99+
    2023-01-30
    线程 多线程 Python
  • Linux释放线程锁的方法是什么
    Linux中释放线程锁的方法是调用pthread_mutex_unlock函数。这个函数用于释放一个已经加锁的互斥锁,使得其他线程可...
    99+
    2024-03-15
    Linux
  • java中多线程和线程安全是什么
    这篇文章给大家分享的是有关java中多线程和线程安全是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是进程?电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中...
    99+
    2023-06-25
  • python多线程互斥锁与死锁
    目录一、多线程间的资源竞争二、互斥锁1.互斥锁示例2.可重入锁与不可重入锁三、死锁一、多线程间的资源竞争 以下列task1(),task2()两个函数为例,分别将对全局变量num加一...
    99+
    2024-04-02
  • python中什么是守护线程
    这篇文章将为大家详细讲解有关python中什么是守护线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、...
    99+
    2023-06-14
  • Java多线程怎么显示锁和内置锁
    这篇文章主要介绍Java多线程怎么显示锁和内置锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java中具有通过Synchronized实现的内置锁,和ReentrantLock实现的显示锁,这两种锁各有各的好处,算...
    99+
    2023-05-30
    java
  • JavaEE的进程,线程是什么和怎么创建线程
    本篇内容介绍了“JavaEE的进程,线程是什么和怎么创建线程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、认识进程、线程 1....
    99+
    2023-06-29
  • java线程池产生死锁的原因是什么
    本篇文章为大家展示了java线程池产生死锁的原因是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向...
    99+
    2023-06-14
  • java线程之死锁产生的原因是什么
    这篇文章主要讲解了“java线程之死锁产生的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java线程之死锁产生的原因是什么”吧!一、什么是死锁死锁是指两个或两个以上的进程在执行过...
    99+
    2023-06-30
  • python线程暂停和恢复的方法是什么
    在Python中,可以使用`threading`模块来创建和管理线程。在线程中,可以使用`Event`对象或者`Condition`...
    99+
    2023-10-26
    python
  • Python主线程与子线程的区别是什么
    Python主线程与子线程的区别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python子线程在创建自身的线程状态对象后,会通过_PyGILState_NoteTh...
    99+
    2023-06-17
  • 悲观锁和乐观锁是什么
    悲观锁和乐观锁是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。乐观锁( Optimistic Locking )乐观锁( ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作