Python中的锁都具有哪些?

Python0182

Python中的锁都具有哪些?,第1张

大致罗列一下:

一、全局解释器锁(GIL)

1、什么是全局解释器锁

每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。GIL的设计简化了CPython的实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。

2、全局解释器锁的好处

1)、避免了大量的加锁解锁的好处

2)、使数据更加安全,解决多线程间的数据完整性和状态同步

3、全局解释器的缺点

多核处理器退化成单核处理器,只能并发不能并行。

4、GIL的作用:

多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。

二、同步锁

1、什么是同步锁?

同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。

2、为什么用同步锁?

因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。

3、怎么使用同步锁?

只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。

4、同步锁的所用:

为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。

三、死锁

1、什么是死锁?

指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。

2、死锁产生的必要条件?

互斥条件、请求和保持条件、不剥夺条件、环路等待条件

3、处理死锁的基本方法?

预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤销进程

四、递归锁

在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。

五、乐观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

六、悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

python常用的加锁方式:互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁大致罗列一下:

一、全局解释器锁(GIL)

1、什么是全局解释器锁

每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。GIL的设计简化了CPython的实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。

2、全局解释器锁的好处

1)、避免了大量的加锁解锁的好处

2)、使数据更加安全,解决多线程间的数据完整性和状态同步

3、全局解释器的缺点

多核处理器退化成单核处理器,只能并发不能并行。

4、GIL的作用:

多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。

二、同步锁

1、什么是同步锁?

同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。

2、为什么用同步锁?

因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。

3、怎么使用同步锁?

只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。

4、同步锁的所用:

为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。

三、死锁

1、什么是死锁?

指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。

2、死锁产生的必要条件?

互斥条件、请求和保持条件、不剥夺条件、环路等待条件

3、处理死锁的基本方法?

预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤销进程

四、递归锁

在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。

五、乐观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

六、悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

python常用的加锁方式:互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁

Python和Go都可以学。Python和是动态语言,而Golang属于编译型语言。

1. 如果是一名非科班编程初学者,第一次学习编程,请选择Python。因为它入门快,容易上手,资料丰富,涉及领域广泛。对初学者极其友好。

2. 如果想要从事大数据分析或人工智能机器学习领域,请学习Python。

4. 如果要成为一名服务后端,建议选择Go。

一般情况下,Go的性能比其他两者要好,并发性能也强很多,在后端生态中,后端服务框架、分布式系统的架构设计等方面要强于Python和Ruby。这里并不是说Python和Ruby开发不了大型系统,早期YouTube就是Python开发的,Github主站是由Ruby开发的。

如果用Go进行后端开发,综合来说会省事一些。想起当年我就是因为Ruby在后端分布式服务中的短板,Rails框架并发性能的不足,以及国内Ruby大环境原因,而选择了转Go。

5. 如果对云原生的开发感兴趣,请选择Go。在这方面,Go拥有绝对优势。

Go最简单,库都挺全且简洁,文档看起来轻松,如果做“严肃”的Web服务端开发,前后端分离,或者分布式微服务开发什么的,那么Go的投入产出比最高,没有之一,效率高,维护方便,多人合作也轻松应对。

Python看起来简单,但学深还是需要时间的,尤其是当你碰到很多用了高级语法的库的时候,你就得搞清这些高级语法对吧,但难度就上来了。当然如果有数据处理/一次性脚本/机器学习方面的需求,用用Python还是不错的。

REST(REpresentationStateTransfer)描述了一个架构样式的网络系统,比如web应用程序。它首次出现在2000年RoyFielding的博士论文中,他是HTTP规范的主要编写者之一。REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。Web应用程序最重要的REST原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI(UniversalResourceIdentifier)得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的HTTP方法,比如GET、PUT、POST和DELETE。Hypermedia是应用程序状态的引擎,资源表示通过超链接互联。另一个重要的REST原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现。RESTful的实现:RESTfulWeb服务与RPC样式的Web服务了解了什么是什么是REST,我们再看看RESTful的实现。最近,使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端点。它忽略HTTP的大部分特性且仅支持POST方法。由于轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java程序、Perl、Ruby、Python、PHP和Javascript[包括Ajax])实现客户端。RESTfulWeb服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的Web浏览器构建一个GETURL并读取返回的内容。在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTPGET、POST、PUT、DELETE,还可能包括HEADER和OPTIONS。在RPC样式的架构中,关注点在于方法,而在REST样式的架构中,关注点在于资源--将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。LeonardRichardson和SamRuby在他们的著作RESTfulWebServices中引入了术语REST-RPC混合架构。REST-RPC混合Web服务不使用信封包装方法、参数和数据,而是直接通过HTTP传输数据,这与REST样式的Web服务是类似的。但是它不使用标准的HTTP方法操作资源。它在HTTP请求的URI部分存储方法信息。好几个知名的Web服务,比如Yahoo的FlickrAPI和del.icio.usAPI都使用这种混合架构。RESTful的实现:RESTfulWeb服务的Java框架有两个Java框架可以帮助构建RESTfulWeb服务。eromeLouvel和DavePawson开发的Restlet(见参考资料)是轻量级的。它实现针对各种RESTful系统的资源、表示、连接器和媒体类型之类的概念,包括Web服务。在Restlet框架中,客户端和服务器都是组件。组件通过连接器互相通信。该框架最重要的类是抽象类Uniform及其具体的子类Restlet,该类的子类是专用类,比如Application、Filter、Finder、Router和Route。这些子类能够一起处理验证、过滤、安全、数据转换以及将传入请求路由到相应资源等操作。Resource类生成客户端的表示形式。JSR-311是SunMicrosystems的规范,可以为开发RESTfulWeb服务定义一组JavaAPI。Jersey是对JSR-311的参考实现。JSR-311提供一组注释,相关类和接口都可以用来将Java对象作为Web资源展示。该规范假定HTTP是底层网络协议。它使用注释提供URI和相应资源类之间的清晰映射,以及HTTP方法与Java对象方法之间的映射。API支持广泛的HTTP实体内容类型,包括HTML、XML、JSON、GIF、JPG等。它还将提供所需的插件功能,以允许使用标准方法通过应用程序添加其他类型。RESTful的实现:构建RESTfulWeb服务的多层架构RESTfulWeb服务和动态Web应用程序在许多方面都是类似的。有时它们提供相同或非常类似的数据和函数,尽管客户端的种类不同。例如,在线电子商务分类网站为用户提供一个浏览器界面,用于搜索、查看和订购产品。如果还提供Web服务供公司、零售商甚至个人能够自动订购产品,它将非常有用。与大部分动态Web应用程序一样,Web服务可以从多层架构的关注点分离中受益。业务逻辑和数据可以由自动客户端和GUI客户端共享。惟一的不同点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各种类型的数据存储提供插件能力。图1展示了自动化客户端,包括Java和各种语言编写的脚本,这些语言包括Python、Perl、Ruby、PHP或命令行工具,比如curl。在浏览器中运行且作为RESTfulWeb服务消费者运行的Ajax、Flash、JavaFX、GWT、博客和wiki都属于此列,因为它们都代表用户以自动化样式运行。自动化Web服务客户端在Web层向ResourceRequestHandler发送HTTP响应。客户端的无状态请求在头部包含方法信息,即POST、GET、PUT和DELETE,这又将映射到ResourceRequestHandler中资源的相应操作。每个请求都包含所有必需的信息,包括ResourceRequestHandler用来处理请求的凭据。从Web服务客户端收到请求之后,ResourceRequestHandler从业务逻辑层请求服务。ResourceRequestHandler确定所有概念性的实体,系统将这些实体作为资源公开,并为每个资源分配一个惟一的URI。但是,概念性的实体在该层是不存在的。它们存在于业务逻辑层。可以使用Jersey或其他框架(比如Restlet)实现ResourceRequestHandler,它应该是轻量级的,将大量职责工作委托给业务层。Ajax和RESTfulWeb服务本质上是互为补充的。它们都可以利用大量Web技术和标准,比如HTML、JavaScript、浏览器对象、XML/JSON和HTTP。当然也不需要购买、安装或配置任何主要组件来支持Ajax前端和RESTfulWeb服务之间的交互。RESTfulWeb服务为Ajax提供了非常简单的API来处理服务器上资源之间的交互。图1中的Web浏览器客户端作为GUI的前端,使用表示层中的BrowserRequestHandler生成的HTML提供显示功能。BrowserRequesterHandler可以使用MVC模型(JSF、Struts或Spring都是Java的例子)。它从浏览器接受请求,从业务逻辑层请求服务,生成表示并对浏览器做出响应。表示供用户在浏览器中显示使用。表示不仅包含内容,还包含显示的属性,比如HTML和CSS。业务规则可以集中到业务逻辑层,该层充当表示层和数据访问层之间的数据交换的中间层。数据以域对象或值对象的形式提供给表示层。从业务逻辑层中解耦BrowserRequestHandler和ResourceRequestHandler有助于促进代码重用,并能实现灵活和可扩展的架构。此外,由于将来可以使用新的REST和MVC框架,实现它们变得更加容易,无需重写业务逻辑层。数据访问层提供与数据存储层的交互,可以使用DAO设计模式或者对象-关系映射解决方案(如Hibernate、OJB或iBATIS)实现。作为替代方案,业务层和数据访问层中的组件可以实现为EJB组件,并取得EJB容器的支持,该容器可以为组件生命周期提供便利,管理持久性、事务和资源配置。但是,这需要一个遵从JavaEE的应用服务器(比如JBoss),并且可能无法处理Tomcat。该层的作用在于针对不同的数据存储技术,从业务逻辑中分离数据访问代码。数据访问层还可以作为连接其他系统的集成点,可以成为其他Web服务的客户端。数据存储层包括数据库系统、LDAP服务器、文件系统和企业信息系统(包括遗留系统、事务处理系统和企业资源规划系统)。使用该架构,您可以开始看到RESTfulWeb服务的力量,它可以灵活地成为任何企业数据存储的统一API,从而向以用户为中心的Web应用程序公开垂直数据,并自动化批量报告脚本。什么是REST:结束语REST描述了一个架构样式的互联系统(如Web应用程序)。REST约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过HTTP直接传输数据的特性,RESTfulWeb服务成为基于SOAP服务的一个最有前途的替代方案。用于web服务和动态Web应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax和RESTfulWeb服务本质上是互为补充的。