问题标签 [event-loop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - node.js 事件循环诊断
是否可以查看事件循环进行诊断?
我想知道当前有多少事件正在等待执行(不包括 setTimeout/interval)。
更新:我想从正在运行的节点进程中执行此操作。
pyqt - 在 PyQt4 主循环中集成 Scrapy/Twisted 事件循环
我正在开发一个 PyQt4 工具,它使用 scrapy 来抓取网站。我启动了一个新进程[multiprocessing] 来从 ui 运行 Scrapy spider。一切正常~ ui 正在阻塞,而 Scrapy 正在抓取。
我想要一个非阻塞的 ui,虽然我想在 PyQt 主循环中集成 Twisted 事件循环。
有谁知道如何尽可能简单地实现这一目标?我是 Scrapy / PyQt / Multiprocessing / Twisted 的新手。
我在一个带有 PyQt4、Python 2.7 和 Scrapy 0.12.0.2546 的 Xubuntu 12.04 机器上。
提前致谢。
javascript - 浏览器中的事件循环和任务队列有区别吗?
我对这个问题的答案中的一些术语有些困惑:JavaScript 中的事件优先级是什么?
事件循环和任务队列之间有区别吗?这些队列有多大?
因为当我设置一个间隔setInterval()
并用一个中断它时,alert()
间隔会在警报出现的时间被丢弃。
yield - 为什么要在事件循环中产生?
我使用了一个 C++ 框架,其中每个循环周期结束时的 yield 是强制性的。现在我从 C# 和 C++/CLI 开始,我也遇到了 yield 函数。我正在创建一个事件循环,并且想知道是否有必要使用 yield。我不是在创建一个帧速率很重要的游戏,我要追求最高性能(速度)。
平台是否不能在不同的应用程序之间正确划分运行时间,因此我应该使用 yield 吗?
如果是,我应该这样做多长时间,使用线程睡眠不是更好吗,所以优先级较低的线程也可以获得一些额外的时间?
也感谢有关 .NET 的其他语言的答案。我只是好奇 yield 的一般目的是否真的有必要。
谢谢
node.js - 运行 NodeJS 事件循环/等待子进程完成
我首先尝试了对问题的一般描述,然后更详细地说明了为什么通常的方法不起作用。如果您想阅读这些抽象的解释,请继续。最后我解释了更大的问题和具体的应用程序,所以如果你愿意阅读,请跳转到“实际应用程序”。
我正在使用 node.js 子进程来做一些计算密集型的工作。父进程完成了它的工作,但在执行的某个时刻,它到达了一个点,它必须在继续之前从子进程获得信息。因此,我正在寻找一种等待子进程完成的方法。
我当前的设置看起来有点像这样:
和其他地方
所以当父进程启动时,它会执行第一段代码,产生一个子进程来计算数据并继续做它自己的工作。当它需要来自子进程的结果才能继续时,它会调用getImportantData()
. 所以这个想法是getImportantData()
阻塞直到数据被计算出来。
但是,我使用的方式不起作用。我认为这是由于我使用 while 循环阻止了事件循环的执行。由于 Event-Loop 不执行,因此无法接收到来自子进程的消息,因此 while-loop 的条件不能改变,使其成为无限循环。
当然,我真的不想使用这种 while 循环。我宁愿告诉 node.js “执行事件循环的一次迭代,然后返回给我”。我会重复这样做,直到收到我需要的数据,然后通过从 getter 返回继续执行我离开的地方。
我意识到他会造成多次重新进入相同功能的危险,但是我想使用它的模块在事件循环中几乎什么都不做,除了等待来自子进程的这条消息并发送其他消息报告它的进度,所以这不应该是一个问题。
有没有办法在 Node.js 中只执行一次事件循环迭代?还是有另一种方法可以实现类似的目标?还是有一种完全不同的方法来实现我在这里尝试做的事情?
到目前为止,我能想到的唯一解决方案是以引入另一个过程的方式更改计算。在这种情况下,将有一个计算重要数据的进程,一个计算不需要重要数据的数据位的进程以及这两个进程的父进程,它只是等待来自两个子进程的数据并组合当它们到达时。由于它本身不需要做任何计算密集型的工作,它可以只等待来自事件循环的事件(=消息)并对它们做出反应,根据需要转发组合的数据并存储尚不能组合的数据片段。然而,这引入了另一个进程,甚至更多的进程间通信,这引入了更多的开销,我想避免这种情况。
编辑
我看到需要更多细节。
父进程(我们称之为进程 1)本身就是一个由另一个进程(进程 0)生成的进程,用于执行一些计算密集型工作。实际上,它只是执行一些我无法控制的代码,所以我不能让它异步工作。我能做(并且已经做过)是让定期执行的代码调用一个函数来报告它的进度并提供部分结果。然后通过 IPC 将此进度报告发送回原始流程。
但在极少数情况下,部分结果不正确,因此必须对其进行修改。为此,我需要一些可以独立于正常计算的数据。但是,此计算可能需要几秒钟;因此,我启动另一个进程(进程 2)来执行此计算并通过 IPC 消息将结果提供给进程 1。现在进程 1 和 2 正在愉快地计算那里的东西,希望进程 2 计算的校正数据在进程 1 需要它之前完成。但有时需要更正流程 1 的早期结果之一,在这种情况下,我必须等待流程 2 完成计算。阻塞进程1的事件循环理论上是没有问题的,因为主进程(进程0)不会受到它的影响。唯一的问题是,
所以我需要在不阻塞事件循环的情况下暂停进程 1 中代码的进一步执行。我希望有这样的调用process.runEventLoopIteration
执行事件循环的迭代然后返回。
然后我会像这样更改代码:
因此执行事件循环,直到我收到必要的数据,但不继续执行调用 getImportantData() 的代码。
基本上我在流程 1 中所做的是:
实际应用/实现/问题
对于以下应用程序,我需要此行为。如果您有更好的方法来实现这一点,请随时提出。
我想执行任意代码并被通知它更改了哪些变量、调用了哪些函数、发生了哪些异常等。我还需要这些事件在代码中的位置,以便能够在 UI 中显示收集到的信息旁边的原始代码。
为了实现这一点,我检测代码并将回调插入其中。然后我执行代码,将执行包装在一个 try-catch 块中。每当使用有关执行的一些数据(例如变量更改)调用回调时,我都会向主进程发送一条消息,告诉它有关更改的信息。这样,当代码运行时,用户就会收到有关代码执行的通知。这些回调生成的事件的位置信息会在检测期间添加到回调调用中,因此这不是问题。
当异常发生时,问题就出现了。我还想通知用户测试代码中的异常。因此,我将代码的执行包装在一个 try-catch 中,任何超出执行的异常都会被捕获并发送到用户界面。但是错误的位置不正确。node.js 创建的 Error 对象有一个完整的调用堆栈,因此它知道它发生在哪里。但是这个位置如果相对于检测代码,所以我不能按原样使用这个位置信息,在原始代码旁边显示错误。我需要将检测代码中的这个位置转换为原始代码中的一个位置。为此,在检测代码之后,我计算了一个源映射将检测代码中的位置映射到原始代码中的位置。但是,此计算可能需要几秒钟。所以,我想,我会启动一个子进程来计算源映射,而检测代码的执行已经开始。然后,当发生异常时,我检查源地图是否已经计算,如果没有,我等待计算完成才能更正位置。
由于要执行和监视的代码可以是完全任意的,我不能轻易地将其重写为异步的。我只知道它调用了提供的回调,因为我检测了代码来这样做。我也不能只存储消息并返回继续执行代码,在下次调用期间检查源映射是否已完成,因为继续执行代码也会阻塞事件循环,阻止计算源在执行过程中从未收到过映射。或者如果接收到它,那么只有在要执行的代码完全完成之后,这可能会很晚或永远不会(如果要执行的代码包含无限循环)。但在收到 sourceMap 之前,我无法发送有关执行状态的进一步更新。结合,
暂时将控制权交给事件循环可以解决这个问题。然而,这似乎是不可能的。我的另一个想法是引入第三个过程,它控制执行过程和 sourceMapGeneration 过程。它从执行过程接收进度消息,如果有任何消息需要更正,它会等待 sourceMapGeneration 过程。由于进程是独立的,所以控制进程可以存储接收到的消息并等待sourceMapGeneration进程,而执行进程继续执行,一旦它接收到源映射,它就会更正消息并将它们全部发送出去。
但是,这不仅需要另一个进程(开销),还意味着我必须在进程之间再次传输代码,因为代码可能有数千行本身可能需要一些时间,所以我想移动它周围尽可能少。
我希望这能解释为什么我不能也没有使用通常的“异步回调”方法。
libevent - CentOS下编译libev(dev)
我想知道是否有关于如何在 Linux (CentOS) 64 位上编译libev-dev的说明。我找不到与 libev 相关的开发包,也找不到任何关于其编译的教程。ps:请不要包管理器-因为我是在没有特权的情况下在云上安装的。
node.js - 如何找出事件循环中是否还有注册的事件(奖励:有多少)
我正在尝试编写一个 Node.js 程序来执行和监视 javascript 程序。我正在寻找一种方法来确定受监控的程序是否仍在“运行”,即做任何有用的事情。
在我目前的方法中,当接收到要测试的代码时,我会启动一个新的子进程并将代码交给它。子进程检测代码使用Contextify创建沙箱并使用此沙箱执行代码。
调用返回后,sandbox.run(code)
我知道代码的阻塞部分已完成,可以在 UI 中显示。但是,我现在不知道代码是否使用 setTimeouts 注册了任何计时器或创建了任何其他会导致部分代码稍后退出的事件源。所以我不知道它是否真的“完成”了。
Node.js 中有没有办法检查事件循环中是否还有要处理的事件(或者更好的是,还剩下多少个)?
我发现了this other question,但它只谈论如何监控事件循环以找出节点的性能是否仍然很好。但我对性能不感兴趣(我不在乎执行代码是阻塞 10 秒还是每 2 分钟只做 1 毫秒),我不想使用外部工具但要了解状态来自节点本身的事件循环。那可能吗?
c++ - C++11 构建事件循环的方法
C++11中事件循环系统的基本结构是什么?关键元素(如消息队列、消息分发器、信号)是如何实现的?例如,我是否还需要 a std::queue<Message>
, astd::mutex
和 a std::condition_variable
,就像我在c++98 + boost方式中所做的那样?此外,性能在我正在寻找的解决方案中很重要。
node.js - Node.JS 和 IIS 的请求机制(事件循环和线程)
我试图弄清楚 Node.JS 事件循环机制(发布和订阅 C++ 线程池)与 IIS 处理请求的方式相比有什么优势。
我在这里读过: http ://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx 和以下行:“没有上下文切换,因为事件循环只是发布和订阅线程池。” 我不清楚。
IIS 有一个将请求发送到 CLR 线程池的 I/O 线程,它会继续工作,直到收到响应。有点类似于我所理解的事件循环。CPU 正在线程之间切换,因此它切换到节点的工作线程(为了完成工作),并且与 CLR 线程池相同。
有人可以解释一下事件循环机制相对于 IIS 使用的请求线程的主要优势是什么?
c++ - 如何从无法直接访问的地方将消息/事件推送到消息队列中?
我在一个多线程程序中有一个永远运行的事件循环,很多函数和方法会将消息推送到这个事件循环。简化版:
这种方法正确吗?如果是这样,在除 main() 之外的其他函数/方法中将事件排入队列的最佳方法是什么?我不喜欢extern Event el
在其他 .cpp 文件中做...