Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从操作系统的角度理解python扭曲的异步性_Python_Asynchronous_Twisted - Fatal编程技术网

从操作系统的角度理解python扭曲的异步性

从操作系统的角度理解python扭曲的异步性,python,asynchronous,twisted,Python,Asynchronous,Twisted,我是twisted库的新手,我试图了解python/twisted中的操作是如何异步执行的。到目前为止,我认为只有类似GUI(Qt或javascript)的平台广泛使用事件驱动架构 事实: Twisted程序在一个线程中运行=无多线程 使用reactor和deferred模式:声明回调/errback,所有操作的执行都由reactor主循环控制 单个CPU永远不能真正并行地执行任何事情,因为它在进程之间共享资源,等等。通过并行代码执行,我的意思是编程平台(python、javascript等)

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

事实:

  • Twisted程序在一个线程中运行=无多线程
  • 使用reactor和deferred模式:声明回调/errback,所有操作的执行都由reactor主循环控制
  • 单个CPU永远不能真正并行地执行任何事情,因为它在进程之间共享资源,等等。通过并行代码执行,我的意思是编程平台(python、javascript等)执行多个操作序列(例如,可以使用多线程来完成)
问题1

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

问题2

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

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

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


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

如果不更准确地定义大量术语并对您的事实提出异议,很难谈论这一点,但以下是我的尝试:

问题1:

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

问题2:


是的,差不多-但是你对Javascript的看法是错误的,它就像是扭曲的一样。

托马斯已经回答了你的第一个问题,但我想在第2个问题上再补充一点。 从您对(第二个)问题的措辞来看,您似乎误解了异步性。 异步不应与多处理混淆。 下面是一个异步性的示例。 假设您有两项任务要完成。 1) 从磁盘读取文件 2) 对内存中的两个整数求和

在同步系统中,这些任务一次完成一项,我们等待操作结果,然后再继续下一项。 在异步系统中,我们启动每个操作,然后定期检查每个操作的完成情况。(这就是漂亮的选择操作的用武之地) 有关详细信息,请参阅此wiki页面:

因此,即使在一个单核系统上,实际上只有一个线程在特定的时间点上运行,我们仍然可以使用异步系统,这样花费很长时间的任务(在上面的示例中读取文件)就不会对可以快速完成其工作的任务(对内存中的一些整数求和)造成麻烦

(作为补充说明,Twisted确实支持生成新线程。
)

我在PyCon 2012上就这个话题做了半小时的演讲

第二季度的前提似乎有点可疑:你不能同时点击几个东西,因为在任何给定的时刻,鼠标只指向一个像素,而AFAIK JavaScript是完全单线程的(模块化web workers,此处不适用),而Python可以有多个线程(尽管有GIL,只要只有一个线程能够主动解释Python代码,seveal线程就可以并行执行)。您能详细说明并证明这种“真正的并行性”吗?@delnan这里没有证据……这就是我现在理解的情况。如果我错了,请纠正我。顺便说一句,你误解了我关于javascript的内容。我不是说javascript是多线程的。我是说你没有实现任何像
reactor.run()
(或者有些事情我不知道;)在浏览器中,事件循环在浏览器中,而不是在JavaScript中,但这不会改变任何事情。非常感谢您的回答。关于
Q1answer
select
的两个问题使反应器能够决定是否可以执行IO操作,对吗?///当
reactor.run()运行时
被激发,然后python解释器进入循环,直到
reactor.stop()
被激发(然后python退出循环)才出来,对吗?///还有一个关于
Q2answer
-你说Javascript就像twisted一样。你是说jQuery和其他库提供了一个类似于
reactor.run()的循环吗
?再次感谢您的回答!Q1:基本上,但实际的api是“OS,告诉我我对哪些文件描述符感兴趣?”