标签: event-loop

可以运行多个主循环?

我正在使用libfuse和glib事件接口,我遇到了一个问题,我需要同时运行多个主循环(glib g_main_loop_runfuse_loop_mt).

我已经尝试在辅助上下文下为glib的事件循环创建一个分离的线程,例如:

static void *
event_loop(void *arg)
{
  GMainLoop *event_loop;
  GMainContext *context;    

  context = g_main_context_new();
  g_main_context_push_thread_default(context);
  event_loop = g_main_loop_new(context, FALSE);
  g_main_loop_run(event_loop);

  return NULL;
}

...

pthread_t event_thread;
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
event_thread = pthread_create(&event_thread, &thread_attr,
    event_loop, NULL);
Run Code Online (Sandbox Code Playgroud)

但是,glib事件循环不会接收任何触发的事件.我在这里完全偏离基地吗?解决多个主循环的正确方法是什么?

c glib fuse event-loop

7
推荐指数
2
解决办法
6100
查看次数

如何确定在事件循环中是否还有事件已注册(奖金:多少)

我正在尝试编写一个Node.js程序来执行和监控javascript程序.我正在寻找一种方法来确定受监控的程序是否仍在"运行",即做任何有用的事情.

在我目前的方法中,当接收要测试的代码时,我启动一个新的子进程并将代码交给它.子进程检测代码使用Contextify创建Sandbox 并使用此沙箱执行代码.

sandbox.run(code)调用返回后,我知道代码的阻塞部分已完成,并且可以在UI中显示.但是,我现在不知道代码是否使用setTimeouts注册了任何计时器,或者创建了任何其他事件源,这些事件源会导致部分代码稍后退出.所以我不知道它是否真的"完蛋"了.

在Node.js中是否有办法检查事件循环上是否还有事件需要处理(或者甚至更好,剩下多少)?

我发现了另一个问题,但它只讨论了如何监视事件循环以确定节点的性能是否仍然正常.但是我对性能不感兴趣(我不在乎执行代码是否阻塞了10s或者每2分钟只执行1ms)并且我不想使用外部工具但是要了解状态内部节点本身的事件循环.那可能吗?

event-loop node.js

7
推荐指数
1
解决办法
332
查看次数

如何在QEventLoop中检测挂起?

我不确定我的问题标题是否正确,所以要解释我的意思,请考虑以下示例:

我用它创建一个QApplication和一个.然后我将一个处理程序附加到按钮上的点击信号,如下所示:QWidgetQPushButton

void MyWidget::on_pushButton_clicked(){
    //Never return
    while(true);
}
Run Code Online (Sandbox Code Playgroud)

最后,我启动应用程序的事件循环,当我运行程序并显示窗口时单击按钮.

在我的情况下,这将停止整个应用程序.所以我现在的问题是如何从代码中"检测"我的应用程序中发生了这种挂断?

我知道编写在信号处理程序中没有返回的代码是不好的做法,我问这个问题是因为我想检测错误并从中恢复,可能是通过重新启动应用程序来努力提高生产时的弹性.

谢谢!

qt event-loop recover hang qt5

7
推荐指数
2
解决办法
3855
查看次数

浏览器的事件循环何时开始?

我正在使用一个框架,它在页面加载时自动连接到服务器.我可以通过传递参数的选项禁用它,但混淆我行是这样:

您可以通过io.sails.autoConnect在事件循环的第一个循环结束之前禁用来阻止此初始套接字自动连接.

我的问题是:

  1. 事件循环的第一个循环何时过去?
  2. 所有现代(IE9 +)浏览器的这种行为是否相同?
  3. 我在lib和我的条目文件之间加载了一堆脚本(在<body>中).第一个周期过去会影响这个吗?编辑:是的,确实如此.
  4. 如何在第一个周期过去之前确保我的代码运行?
  5. 这种自动连接的实现被认为是好的做法吗?

javascript browser event-loop sails.js

7
推荐指数
1
解决办法
368
查看次数

是否可以在不调用QApplication :: exec()的情况下创建本地事件循环?

我想创建一个基于其构建的库,QTcpServerQTcpSocket用于在其main函数中没有事件循环的程序中(因为Qt事件循环是阻塞的,并且不能为所需的实时操作提供足够的时序分辨率).

我希望通过在类中创建本地事件循环来解决这个问题,但除非我app->exec()首先调用main函数,否则它们似乎不起作用.有没有办法创建本地事件循环并允许在线程内进行信号/插槽通信而无需应用程序级事件循环?

我已经看过有没有办法在没有QApplication :: exec()的情况下使用Qt?但答案没有帮助,因为似乎解决方案添加了本地事件循环但不删除应用程序循环.

c++ qt event-loop qeventloop qapplication

7
推荐指数
1
解决办法
2272
查看次数

Promise/A + spec第2.2.4条的目的是什么?

promise/a +规范第2.2.4条规定:

在执行上下文堆栈仅包含平台代码之前,不得调用onFulfilled或onRejected.

然后在笔记中说明:

这里的"平台代码"意味着引擎,环境和承诺实现代码.实际上,这个要求确保onFulfilled和onRejected异步执行,然后调用事件循环,然后调用新堆栈.

这样做的目的是确保当链中存在大量onFulfilled函数时,它们的执行不会导致线程阻塞吗?

或者在我不读的行之间还有其他什么东西吗?

javascript event-loop promise es6-promise

7
推荐指数
1
解决办法
141
查看次数

了解已解析的promise的后续then()处理程序的执行顺序

我正在学习Promise,为了理解它我读了一些关于JavaScript的事件循环.此文章简要介绍了事件循环的工作,如调用堆栈,事件表和消息队列.

但我不知道调用堆栈如何处理包含'return'的行,以及之后会发生什么.下面是我写的一个例子,希望了解Promise如何基于事件循环工作.如果你想试一试,请参阅http://jsbin.com/puqogulani/edit?js,console.

var p1 = new Promise(
  function(resolve, reject){
    resolve(0);
});

p1.then(function(val){
  console.log(val);
  p1.then(function(){
    console.log("1.1.1");
    p1.then(function(){
      console.log("1.1.2");
      p1.then(function(){
        console.log("1.1.3");
      });
    });
  });

  p1.then(function(){
    console.log("1.2");
  })

  return 30;

  //return new Promise(function(resolve, reject){
  //  resolve(30);
  //});

})
  .then(function(val){
  console.log(val/2);
});

p1.then(function(){
  console.log("2.1");
});

console.log("Start");
Run Code Online (Sandbox Code Playgroud)

可以看出,有两个"返回",使用它们中的每一个都会给出不同的输出顺序.具体来说,使用时return 30;,1.1.2, 1.1.3都是经过15,但使用的时候return new Promise(...),1.1.2, 1.1.3是前15.那么当代码达到两个不同的"返回"时究竟发生了什么?

javascript callstack event-loop

7
推荐指数
1
解决办法
152
查看次数

NodeJS事件循环中的轮询阶段

我正在通过节点文档进行事件循环,我感到非常困惑.它说 -

timers: this phase executes callbacks scheduled by setTimeout() and 
setInterval().
I/O callbacks: executes almost all callbacks with the exception of close callbacks, the ones scheduled by timers, and setImmediate().
idle, prepare: only used internally.
poll: retrieve new I/O events; node will block here when appropriate.
check: setImmediate() callbacks are invoked here.
close callbacks: e.g. socket.on('close', ...).
Run Code Online (Sandbox Code Playgroud)

然后在详细的轮询阶段,他们说它执行使用计时器调度的计时器,并且还处理轮询队列中的i/o事件.我的困惑是,我们已经有那些回调的计时器阶段和i/o回调阶段,然后轮询阶段完成的工作是什么.它还说线程可能在轮询阶段睡觉,但我没有正确.
我的问题是 -

  1. 当我们已经有定时器和i/o回调阶段时,为什么轮询阶段正在执行定时器和i/o的脚本?
  2. 是否轮询阶段代表定时器执行回调和i/o回调阶段和定时器和回调阶段仅用于内部处理在此阶段没有执行回调?
  3. 我们在哪里可以将承诺放在这个循环中?之前我认为promises可以简单地认为是回调,我们可以将它们视为回调,但是在这个视频中,他说promises会进入内部事件循环,但是没有详细说明.

在这一点上我很困惑.任何帮助将不胜感激.

javascript event-loop node.js

7
推荐指数
2
解决办法
973
查看次数

异常"在新循环上运行时,线程'MainThread'中没有当前事件循环

这是简单的测试代码和结果.

import asyncio

async def test():
    await asyncio.sleep(1)

if __name__ == '__main__':

    asyncio.set_event_loop(None)      # Clear the main loop.
    loop = asyncio.new_event_loop()   # Create a new loop.
    loop.run_until_complete(test())   # Run coroutine over the new loop
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
  File "test_test.py", line 11, in <module>
    loop.run_until_complete(test())
  File "/usr/lib/python3.5/asyncio/base_events.py", line 387, in run_until_complete
    return future.result()
  File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
    raise self._exception
  File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
    result = coro.send(None)
  File "test_test.py", line 5, in test
    await asyncio.sleep(1)
  File …
Run Code Online (Sandbox Code Playgroud)

python event-loop python-3.x python-asyncio python-3.5

7
推荐指数
1
解决办法
2437
查看次数

为什么这个javascript在Node.js中阻塞?

我有以下使用Node.js的简单http服务器:

var http = require('http');

var server = http.createServer(function(req, res) {
    var counter = 0;

    for(var i = 1; i <= 30; i++) {
        http.get({ host: "www.google.com" }, function(r) {
            counter++;
            res.write("Response " + counter + ": " + r.statusCode + "\n");
            if(counter == 30) res.end();                                                                                                                                   
        });
    }
});

server.listen(8000);
Run Code Online (Sandbox Code Playgroud)

当我在端口8000上卷入我的本地主机时,我确实得到了预期的结果:

Response 1: 200
Response 2: 200
Response 3: 200
...
Response 30: 200
Run Code Online (Sandbox Code Playgroud)

但是当我在第一个进程运行时尝试从另一个终端卷入时,我看到控制台挂起并等待第一个进程完全完成,然后才开始接收相同的输出.

我的理解是,由于这是使用回调的异步代码,节点可以通过在事件循环的下一个滴答处理它们来同步处理多个请求.事实上,我甚至还观看过Ryan Dahl的视频,其中有一个类似于hello world的例子.我的代码中有什么东西可以阻止服务器阻塞?

javascript nonblocking event-loop node.js

6
推荐指数
2
解决办法
1825
查看次数