我使用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);
发布于 2017-06-14 17:55:25
它阻止整个应用程序,因为回调函数my_read_cb()
在与ev_run()
函数相同的线程(也称为main)中执行。这就是反应堆模式的工作方式,您的代码应该是“非阻塞的”,这意味着您应该避免任何I/O等待、sleep()
调用、互斥等待等。在您的情况下,很难通过各种库(如MySQL驱动程序)来遵循这样的要求。
(至少)有三种方法可以解决这个问题:
getaddrinfo
系列中的POSIX系统DNS阻塞调用相反)。https://stackoverflow.com/questions/42689219
复制相似问题