`
wwty
  • 浏览: 536681 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

并发编程的概念知识以及twisted的引出

阅读更多

并发编程介绍:
要完成某些计算任务经常需要不少时间,其原因有两点:
任务是计算集中型的(比如,求一个很大整数的所有因数),并且需要相当的CPU时间进行计算;或者
任务并不是计算集中型的,但是需要等待某些数据,以产生结果。

 

等待回应
网络编程的基本功能就是等待数据。想象你有一个函数,这个函数会总结一些信息并且作为电子邮件发送。函数需要连接到一个远程服务器、等待服务器的回应、检查服务器能否处理这封电子邮件、等待回应、发送电子邮件、等待确认信息,然后断开连接。

这其中任何一步都有可能占用很长时间。你的程序可能使用所有可能模型中最简单的一个——它实际上只是停下来等着数据的发送和接收,但在这种情况下,它有非常明显的基本限制:它不能同时发送多封电子邮件;并且在发送电子邮件的时候,它其实什么也做不了。

因此,除了最简单的之外,所有网络程序都会避免这种模型。另外还有许多不同的模型,它们都允许你的程序在等待数据以继续某个任务的同时,继续做手头上的其他任务,这些模型你都可以采纳。

Twisted是众多模型中的一种:在一个线程中,使用非阻塞的系统调用来处理所有连接。
当在一个线程中处理多个连接时,调度就成为了应用程序的责任,而不是操作系统的。调度通常的实现方案是:当连接准备好读或是写时,调度系统会调用一个之前注册过的函数——通常被叫做异步,事件驱动或是基于回调的编程。

 

在这种模型下,之前发送电子邮件的函数应该是象这样的:
调用一个连接函数,用以连接到远程服务器;
连接函数立刻返回,暗示着当连接建立后,将调用电子邮件发送的通知;并且
连接一旦建立,系统就会通知发送电子邮件的函数,连接已经准备就绪。

从上面的文字当中,可以看出并发编程出现的原因是因为出现了用户的某一个请求是计算集中型的,或者是需要数据等待的类型,这样就造成了各方面的等待现象:人们在计算机旁边坐着等待最终结果的返回,而CPU的资源并没有得到充分的利用,CPU也在等待结果;因为造成的这种等待并不是CPU资源不够用造成的,而是自然规律上需要的等待;大家只要稍微用心考虑一下,就可以想明白。所以如果能将当前等待的事情放置起来,让CPU去先处理其他的工作,等放置起来的任务有结果返回了,再去进行下面的处理。这个过程当中有一个问题,就是如何触发CPU来处理放置起来的工作?

 

callback
callback(回调)是通知应用程序数据已经就绪的经典模型。应用程序在调用一个方法,试图获取一些数据时,同时提供一个callback函数,当数据就绪时,这个callback函数会被调用,并且就绪的数据就是调用的参数之一。因此,应用程序应该在callback函数中,继续执行之前获取这些数据时,想要执行的任务(当时没能马上得到这些数据,所以当时无法执行这些任务——译者注)。

在同步编程中,一个函数会先请求数据,然后等待数据,最后处理它。在异步编程中,一个函数请求数据之后,会在数据准备就绪后,让外部库调用其callback函数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics