c - 在 libev 事件回调函数中调用阻塞函数是否会阻塞整个应用程序?

标签 c event-driven mysql-connect libev

我使用 libev 来开发我的事件驱动应用程序。我喜欢查询远程 mysql 服务器内部的事件。所以, mysql_real_connect 阻止整个应用程序还是仅阻止 my_read_cb

根据以下代码

my_read_cb(EV_P_ ev_io *w, int revents) {

    mysql_real_connect(*mysql, "host", "user", "pass", "db", 3306, NULL, 0);
}


struct ev_loop *loop = ev_default_loop(0);
ev_io_init(io, my_read_cb, network_fd, EV_READ);
ev_io_start(loop, io);
ev_run(loop, 0);

最佳答案

它会阻塞整个应用程序,因为回调函数 my_read_cb()ev_run() 函数在同一线程(也称为主线程)中执行。 就是这样reactor pattern有效,你的代码应该是“非阻塞”的,这意味着你应该避免任何 I/O 等待、sleep() 调用、互斥等待等。传统的阻塞很难满足这样的要求来自各种库的代码,例如您案例中的 MySQL 驱动程序。

(至少)有三种方法可以解决这个问题:

  • 接受事件循环不时被阻塞的事实。在某些应用程序中,这可能不是什么大问题。
  • 实现proactor pattern - 这基本上意味着每个处理程序回调都是在与主线程不同的工作线程中执行的,因此,事件循环不会被阻止。这就是 Node.js 提供的或 C 世界中的 libuv等等。
  • 找到与您的事件循环兼容的库的异步/非阻塞实现。在这里你需要特别幸运。一个例子是例如https://c-ares.haxx.se用于异步 DNS 解析(与 getaddrinfo 系列中的 POSIX 系统 DNS 阻止调用相反)。

关于c - 在 libev 事件回调函数中调用阻塞函数是否会阻塞整个应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689219/

相关文章:

php - mysql_connect() 总是拒绝访问

php - MySQL 连接失败。无法连接到 'http' 上的 MySQL 服务器 (4)

PHP MySQL 问题

c - 显示功能问题

C Linux stat() 以纳秒精度获取 atime/mtime

javascript - ng-keypress 调用 angularjs 中的函数

javascript - 在 Angular.js 应用程序中进行事件驱动开发的最佳实践是什么?

c - Sqlite源代码阅读。 F17025、U17032 等 id 有何用途?

c - 用C递归计算整数sqrt

javascript - for 循环事件驱动代码?