理解python在操作系统方面的扭曲异步性

时间:2013-10-06 17:14:59

标签: python asynchronous twisted

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

事实

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

问题1

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

问题2

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

问题1:

尝试man select,这大致就是Twisted的实现方式 - 这是一种要求操作系统同时监控多个事物的方法,让应用程序知道它们中的任何一个是否触发(阻止多个事物)。

问题2:

是的,差不多 - 但你对Javascript错了,就像Twisted一样。

答案 1 :(得分:2)

托马斯已经回答了你的第一个问题,但我想在问题2中添加额外的内容。 从你提出的(第二个)问题的方式来看,似乎你很多人误解了异步性。 不应将异步与多处理混淆。 这是异步性的一个例子。 让我们说你有两个任务需要完成。 1)从磁盘读取文件 2)在内存中求和几个整数

同步系统中,这些任务一次完成一次,我们等待操作结果,然后再继续操作。 在异步系统中,我们启动每个操作,然后定期检查每个操作的完成情况。 (这是精彩的选择操作的来源) 有关详细信息,请参阅此Wiki页面:http://en.wikipedia.org/wiki/Asynchronous_I/O

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

(作为旁注,Twisted确实支持产生新线程。 http://twistedmatrix.com/documents/11.0.0/core/howto/threading.html

答案 2 :(得分:2)

我在PyCon 2012上就这个确切话题进行了半小时的讨论。You can watch it online here.