6

我是twisted 库的新手,我试图了解python/twisted 中的操作是如何异步执行的。到目前为止,我认为只有类似 GUI(Qt 或 javascript)的平台广泛使用事件驱动架构。

事实

  • 扭曲的程序在一个线程中运行 = 没有多线程
  • 使用了 reactor 和 deferred 模式:声明了回调/errbacks,所有内容的执行都由 reactor 主循环控制
  • 单个 CPU 永远无法真正并行执行任何操作,因为它在进程之间共享其资源等。并行代码执行是指编程平台(python、javascript 等)执行多个操作序列(可以完成,例如,使用多线程)

问题 1

Python 可以被视为操作系统的高级包装器。提供异步操作处理的 OS 函数(或 C 函数)是什么?有吗?

问题2

Q1 让我想到了一个想法,twisted 的异步性并不是真正的异步性,就像我们在 Javascript 中那样。例如,在 JavaScript 中,如果我们提供 3 个不同的按钮,将回调函数附加到它们并单击所有三个按钮 - 那么这 3 个回调将并行执行。真正并行。

在 Twisted 中 - 据我了解 - 这不是真正的异步 - 比方说,它是近似的异步,因为不会并行执行任何操作(就代码而言,正如我在 fact3 中提到的那样)。在 Twisted 中,前 n 行代码(定义协议、工厂、连接等)是对整个系统启动时将要发生的事情的声明。到目前为止什么都没有。真正的执行开始,然后reactor.run()被触发。我了解反应器运行时基于单个while True循环遍历事件。反应器检查任何等待执行的任务,处理它们,将它们的结果发送回队列(回调或 errbacks)。在下一个循环执行中,它们将被进一步处理。所以延迟执行实际上是线性的(尽管从外部看起来它是并行执行的)。我的解释正确吗?

如果有人能回答我的问题和/或解释异步如何在扭曲/python 平台中工作以及它与操作系统有何关系,我将不胜感激。提前感谢您的良好解释!

编辑:非常欢迎指向解释异步性的文章的链接!

4

3 回答 3

5

如果不更准确地定义很多术语并对您的事实提出质疑,就很难谈论这个问题,但这是我的尝试:

问题一:

Try man select,这大概是 Twisted 的实现方式 - 这是一种要求操作系统一次监视多个事物并让应用程序知道它们中的任何一个何时触发(阻止多个事物)的方法。

问题2:

是的,差不多 - 但你对 Javascript 的看法是错误的,它就像 Twisted。

于 2013-10-06T17:21:17.743 回答
2

我在 PyCon 2012 上就这个主题进行了半小时的演讲。 你可以在这里在线观看。

于 2013-10-07T17:52:39.133 回答
2

Thomas 已经回答了您的第一个问题,但我想在问题 2 中添加一些额外内容。从您对(第二个)问题的表述方式来看,您似乎对异步性有很多误解。异步不应与多处理相混淆。这是一个异步的例子。假设您有两个任务要完成。1) 从磁盘读取文件 2) 对内存中的几个整数求和

同步系统中,这些任务一次完成一个,我们等待操作的结果,然后再继续下一个。在异步系统中,我们启动每个操作,然后定期检查每个操作的完成情况。(这就是漂亮的选择操作出现的地方)有关更多信息,请参阅此 wiki 页面:http ://en.wikipedia.org/wiki/Asynchronous_I/O

因此,即使在实际上只有一个线程在特定时间点运行的单核系统上,我们仍然可以拥有一个异步系统,以便需要很长时间的任务(在上面的示例中读取文件)不会抛出扳手正在处理可以快速完成工作的任务(对内存中的一些整数求和)

(附带说明一下,Twisted 确实支持生成新线程 。http: //twistedmatrix.com/documents/11.0.0/core/howto/threading.html

于 2013-10-06T18:48:16.910 回答