1、单线程同步模型在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。2、多线程同步模型在多线程中,这每个任务分别在独立的线程中执行。线程由 *** 作系统管理,并且可以在具有多个处理器或多个内核的系统上真正并发运行,或者可以在单个处理器上交错运行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的单线程程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的BUG。3、异步模型在异步模型程序中,任务交错执行,但仍在一个线程中。当处理I/O或者其他昂贵的 *** 作时,它会转而执行一些仍然可以取得进展的其他任务。单线程异步系统将始终以交错方式执行,即使在多处理器系统上也是如此。注意,可以混合使用异步模型和线程模型,并在同一个系统中使用这两种模型。异步模型的基本思想是,当一个异步程序面临一个通常会在同步程序中阻塞的任务时,它将转而执行一些仍然可以取得进展的其他任务。因此,当没有任务可以取得进展时,异步程序才会“阻塞”,因此称为非阻塞程序。每次从一个任务转换到另一个任务都对应着前一个任务的完成,或者到达一个必须停止的点。有了大量潜在的阻塞任务,异步程序可以通过花费更少的总等待时间,而将大致相同的时间用于单个任务的实际工作,从而比同步程序的性能更好。4、异步模型和同步模型的区别异步模型比线程模型更简单,因为有一个指令流和任务显式地放弃控制,而不是任意地挂起。异步模型的实现显然比同步模型更复杂。程序员必须把每个任务组织成一个小步骤序列,这些步骤间歇性地执行。如果一个任务使用另一个任务的输出,依赖的任务必须被写入以接受它的输入作为一系列的比特和片段,而不是全部在一起。由于没有实际的并行性,异步程序的执行时间可能和同步程序的执行时间一样长,也许更长因为异步程序可能表现出较差的引用局部性。5、为什么要选择使用异步模型呢如果一个或多个任务负责为人类实现一个界面,那么通过将这些任务交织在一起,系统可以在“后台”执行其他工作的同时保持对用户输入的响应。因此,虽然后台任务可能不会执行得更快,但系统会让使用者感到更愉快。当任务被迫等待或阻塞时,异步系统的性能会明显优于同步系统,从更短的时间内完成所有任务的意义上来说,尤其优越。6、与同步模型相比,异步模型在以下情况下性能最好:有大量的任务,所以很可能总有至少一项任务可以取得进展。这些任务执行大量的I/O,导致同步程序浪费大量时间阻塞,而其他任务可能正在运行。这些任务在很大程度上是相互独立的,因此几乎不需要任务间的通信(因此一个任务要等待另一个任务)。这些条件几乎完美地描述了客户机-服务器环境中典型的繁忙网络服务器(如web服务器)。每个任务用I/O表示一个客户端请求,其形式是接收请求并发送应答。客户端请求(主要是读取)在很大程度上是独立的。因此,网络服务器实现是异步模型的主要候选,这就是为什么Twisted首先是一个网络库的原因。2、事件驱动模型流水式编程:开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束事件驱动模型:开始---->初始化---->等待事件驱动模型可以分为3类。当每收到一个请求的时候,创建一个线程来处理请求。当每收到一个请求的时候,创建一个进程来处理请求。当每收到一个请求的时候,将一个请求放进事件列表,让主进程通过非阻塞I/O方式来处理请求。#(这种方法是指协程事件驱动的方式。)
第(1)种方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。
综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式
总结
以上是内存溢出为你收集整理的python网络编程04 异步与同步编程、事件驱动全部内容,希望文章能够帮你解决python网络编程04 异步与同步编程、事件驱动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)