我是twisted库的新手,我试图理解python/twisted中的操作是如何异步执行的。到目前为止,我认为只有类似GUI(Qt或javascript)的平台才广泛使用事件驱动架构。在
事实:
问题1
Python可以看作是操作系统的高级包装器。提供异步操作处理的操作系统函数(或C函数)是什么?有吗?在
问题2
Q1让我想到了一个想法,twisted的异步性并不是真正的异步性,就像我们在Javascript中所做的那样。例如,在JavaScript中,如果我们提供3个不同的按钮,将回调函数附加到它们上,然后我们单击所有三个按钮,那么这3个回调将并行执行。完全平行。在
在Twisted中,据我所知,它不是真正的异步,它是,比方说,近似于异步性,因为没有操作可以并行执行(就代码而言,正如我在fact3中提到的那样)。在Twisted中,第一个n行代码(定义协议、工厂、连接等)是整个系统启动时将发生什么的声明。到目前为止没有什么进展。实际执行开始后,reactor.run()
被触发。我知道reactor运行时基于一个遍历事件的while True
循环。reactor检查所有等待执行的任务,对其进行处理,将结果发送回队列(回调或errback)。在下一个循环执行中,它们将被进一步处理。所以延迟执行实际上是线性的(不过,从外部看,它看起来是并行执行的)。我的解释正确吗?在
如果有人能回答我的问题和/或解释异步在twisted/python平台中是如何工作的,以及它与操作系统的关系如何,我将不胜感激。提前感谢你的解释!在
编辑:非常欢迎指向解释异步性的文章的链接!
托马斯已经回答了你的第一个问题,但我想在问题2的基础上再补充一点。 从你对(第二个)问题的措辞来看,你似乎误解了异步性。 不应将异步与多处理混为一谈。 下面是异步性的一个例子。 假设您有两个任务要完成。 1) 从磁盘读取文件 2) 对内存中的几个整数求和
在一个同步系统中,这些任务一次完成一个,我们等待操作结果,然后再继续下一个。 在异步系统中,我们启动每个操作,然后定期检查每个操作的完成情况。(这就是漂亮的选择操作的地方) 有关详细信息,请参阅此wiki页面:http://en.wikipedia.org/wiki/Asynchronous_I/O
因此,即使在一个单核系统上,在一个特定的时间点上,实际上只有一个线程在运行,我们仍然可以有一个异步系统,这样那些耗时较长的任务(在上面的例子中读取一个文件)不会对那些能够快速完成工作的任务(在内存中求和一些整数)造成麻烦
(顺便说一句,Twisted确实支持生成新线程。 http://twistedmatrix.com/documents/11.0.0/core/howto/threading.html)
我在2012年的PyCon大会上就这个问题做了半小时的演讲。You can watch it online here.
如果不更精确地定义许多术语并对您的事实提出异议,很难谈论这一点,但我的尝试是:
问题1:
试试
man select
,这大概就是Twisted的实现方式——这是一种要求操作系统同时监视多个对象并在其中任何一个触发时让应用程序知道的方法(阻塞多个对象)。在问题2:
是的,差不多-但是你错了Javascript,它就像Twisted。在
相关问题 更多 >
编程相关推荐