标签: event-loop

我不完全理解JavaScript线程

在我深入研究这个问题之前.让我说,通过Event Loop,我指的是http://en.wikipedia.org/wiki/Event_loop.这是浏览器实现的东西.欲了解更多信息,请阅读:http://javascript.info/tutorial/further-javascript-features/events-and-timing-depth.

这个问题很难而且很长,所以请尽量忍受!我非常感谢所有答案!


所以.现在,据我所知,在JavaScript中有一个主线程(在大多数浏览器环境中).所以,代码如下:

for (var color = 0x000; color < 0xfff; color++) {
    $('div').css('background-color', color.toString(16));
}
Run Code Online (Sandbox Code Playgroud)

将生成从黑到白的动画,但你不会看到,因为渲染是在代码处理完成后(当下一个滴答发生时 - 浏览器进入事件循环).

如果你想看动画,你可以这样做:

for (var color = 0x000; color < 0xfff; color++) {
    setTimeout(function() {
        $('div').css('background-color', color.toString(16));
    }, 0);
}
Run Code Online (Sandbox Code Playgroud)

上面的例子会生成一个可见的动画,因为setTimeout将一个新事件推送到浏览器Event Loop堆栈,该堆栈将在没有任何运行后进行处理(它进入Event Loop以查看下一步该做什么).

在这种情况下,浏览器似乎将0xfff(4095)事件推入堆栈,其中每个事件都通过它们之间的渲染过程进行处理.那么,我的第一个问题(#1)是什么时候进行渲染?它总是发生在事件循环堆栈中处理两个事件之间吗?


第二个问题是关于我给你的javascript.info网站链接中的代码.

...
  function func() { 
    timer = setTimeout(func, 0)
    div.style.backgroundColor = '#'+i.toString(16)
    if (i++ == 0xFFFFFF) stop()
  }

timer = setTimeout(func, 0)
....
Run Code Online (Sandbox Code Playgroud)

我的问题是,浏览器每次到达div.style. ... = ...线路时都会将新的"渲染"事件推送到事件循环堆栈吗?但是,由于setTimeout-call,它是否首先推送事件?那么,浏览器最终是否像堆栈一样:

setTimeout event
render …
Run Code Online (Sandbox Code Playgroud)

javascript browser event-loop

5
推荐指数
1
解决办法
952
查看次数

当在错误槽中启动事件循环时发生ContentNotFoundError时,QNetworkReply会发出两次错误信号

我使用QtSDK 4.7.3

我在(void test())中这样做:

mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));

connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
    SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);
Run Code Online (Sandbox Code Playgroud)

当然,调用插槽onError:

if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
Run Code Online (Sandbox Code Playgroud)

如果我在onError插槽中没有messagebox/eventloop,则没有崩溃,一切正常.但是当它存在时,调用m.exec()时会再次调用onError槽.当两个消息框都关闭并且我将函数保留为onError时,应用程序崩溃.发生这种情况时,应用程序会尝试删除/释放内存.错误"访问冲突读取位置"没有任何帮助,调用堆栈深入到Qt dll.

我检查了什么:
信号没有连接两次.
尝试在QApplication调用它的exec函数之前和之后调用test().(没关系).
像HostNotFound这样的另一个错误不会两次调用onError插槽.
我的所有代码都在主线程中执行.
尝试断开onError插槽,因此只调用一次,但它仍然崩溃.
试图在onError()中对请求进行中止调用.
在Qt论坛(帖子)上发表了同样的问题.

任何人都可以帮我弄清楚这里发生了什么?

这是我用于测试的代码:main.cpp

#include "contentnotfound.h"
#include <QtGui/QApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

ContentNotFound cnf;

// false: start test after application's event loop have …
Run Code Online (Sandbox Code Playgroud)

c++ qt runtime-error event-loop qnetworkaccessmanager

5
推荐指数
1
解决办法
2361
查看次数

Nodejs事件循环查询

众所周知,Nodejs 正在处理后台循环中的所有事件。但是如何监控所有活动事件,是否存在内存不足或死锁的潜在风险?

event-loop node.js

5
推荐指数
1
解决办法
325
查看次数

ZeroMQ Poller vs Tornados EventLoop

设计明智和性能明智哪种方法建议用于处理多个Zeromq插座,为什么?

ZeroMQ使用的Tornado的IOLoop是否真的比使用while循环中的Poller处理多个套接字的CPU少?

python tornado event-loop zeromq poller

5
推荐指数
1
解决办法
2551
查看次数

如何制作一个正确的事件循环(或任何它被称为)?

我不是程序员或其中任何一个,我只是对这些东西感兴趣的人.

我一直在努力使自己成为一个Xbox 360控制器映射器,将控制器按键转换为模拟键盘按键.原因是我真诚地不喜欢那些人,而且必须付出代价才能获得大部分.承诺,如果我做得足够好,我喜欢我制作的东西,我会免费分发给大家使用.

无论如何,我已经制作了一个有效的命令行版本,但仍然像我希望的那样友好,但仍然做得更好,大多数人都想要它甚至像这样.有一件事我不得不问......

由于我不是程序员或任何类型的人,我缺乏经验丰富的教学,除了我从互联网上获得的教学.但是这个我找不到的东西:如何在循环中为程序制作适当的呼吸间隙?也许我应该首先问一下,是否做对......

...
while ( 1 ) {
    if ( ( GetAsyncKeyState( keyID ) & 0x8000 ) == 0x8000 ) {
        /* do this, do that */
        break;
    }
    /* breathing */
}
...
Run Code Online (Sandbox Code Playgroud)

......像上面那样的结构?

我假设并且仍然认为它是,因为我不知道如何用这种C语言捕获用户的输入.这将是很好的了解,而不是承担.

如果是这样,那么我的主要问题是; 如何给程序提供呼吸空间,这样它不会给CPU带来太多压力?换句话说,我应该如何更换/* breathing */上面的部分?我一直在使用Sleep( 20~25 );s,我的任务管理器只是一直显示0%的CPU使用率,即使Sleep( 5 )实际上是...

使用睡眠有什么不好吗?还有更好的选择吗?

c event-loop infinite-loop

5
推荐指数
1
解决办法
418
查看次数

Node.js 异步调用处理和多核扩展

众所周知,node.js 内部处理异步调用,程序员永远不需要关心后台发生了什么。据我所知,即使每个人都说 node.js 只是单线程,但内部 v8/libuv 库正在产生线程来处理程序的异步片段的执行。

我的问题是,如果产生这些线程,它们是否会扩展多核架构?我的意思是,如果我有一个 4 核的 CPU,并且我的主节点线程在其中一个 CPU 上运行,那么这些内部产生的线程是否会扩展到其他三个 CPU 而不会保留在同一个 CPU 上。从理论上讲,它们应该可以扩展,但由于每个人都说 node.js 开箱即用不使用多核,我认为这值得一问。

multithreading asynchronous multicore event-loop node.js

5
推荐指数
1
解决办法
682
查看次数

Python 3.5 asyncio 从不同线程中的同步代码在事件循环上执行协程

我希望有人能在这里帮助我。

我有一个对象,它能够拥有返回协程对象的属性。这工作得很好,但是我有一种情况,我需要从单独线程中的同步代码中获取协程对象的结果,而事件循环当前正在运行。我想出的代码是:

def get_sync(self, key: str, default: typing.Any=None) -> typing.Any:
    """
    Get an attribute synchronously and safely.

    Note:
        This does nothing special if an attribute is synchronous. It only
        really has a use for asynchronous attributes. It processes
        asynchronous attributes synchronously, blocking everything until
        the attribute is processed. This helps when running SQL code that
        cannot run asynchronously in coroutines.

    Args:
        key (str): The Config object's attribute name, as a string.
        default (Any): The value to use if the Config …
Run Code Online (Sandbox Code Playgroud)

multithreading event-loop coroutine python-3.x python-asyncio

5
推荐指数
1
解决办法
2421
查看次数

Javascript 事件循环:在哪里执行 web api?

在阅读 JS 事件循环时,我很好奇 web api 的执行位置。例如,在这张图片中,粉红色的盒子没有名字(只是说“具体实现”),让我想知道这些 web api在哪里执行。调用栈、事件循环、消息队列都有名字。我还看到 Philip Roberts谈到事件循环,他只是将其称为“Web API”。

因此,当调用堆栈中到达 Web api 时,它会关闭并在其余调用堆栈运行时执行。但是那个 web api 调用去哪里执行呢?例如,如果有一个 5 秒的固定时间,那么这 5 秒在哪里?

javascript event-loop

5
推荐指数
1
解决办法
1160
查看次数

查看 Javascript 微任务队列

有什么办法可以看到微任务队列吗?或者测试微任务是否阻塞了宏任务队列?

这是一个无法看到 queuej 的真正问题。

javascript event-loop dom-events

5
推荐指数
0
解决办法
73
查看次数

JS 引擎或浏览器/节点外部 API 如何安排承诺回调与 setTimeout?

我在问题的两个不同部分考虑整个 JS 环境。

  1. JS引擎
  2. 浏览器 API、节点 API(JS 引擎外部)。

JavaScript 引擎(V8、SpiderMonkey)是单线程的,在 ES6 之前,在 ES6 引入 Promise 概念之前,没有在 JavaScript 中运行异步代码的机制。

我了解在 promises 出现之前,浏览器或 Node API(服务器端 JS)用于提供异步运行代码的机制,setTimeout and Process.nextTick并且由于 Promises 原生支持在 Javascript 中运行异步代码,我试图了解 promise 回调和 setTimeout 是如何实现的计划先运行一个。

这是否意味着存在两个事件循环并且它们相互协调?首先在浏览器/节点 API 中运行代码setTimeout and Process.nextTick,另一个在 JS 引擎中运行承诺回调,如果没有,那么它们是如何调度的,因为setTimeout and Process.nextTickJS 引擎中不存在定义,但 JS 引擎中必须存在 Promise 定义,因为 Promise 是 ES6标准。

我还想了解任务队列、作业队列、mircotasks 在哪里存在和管理,在 JS 引擎内部或外部引擎(在浏览器或 Node API 中)。

javascript event-loop settimeout node.js promise

5
推荐指数
1
解决办法
1203
查看次数