[英]Does calling a blocking function inside libev event callback function blocks whole app?
I use libev to develope my event-driven app. 我使用libev开发我的事件驱动的应用程序。 I like to query remote mysql server inside events.
我喜欢查询事件内部的远程mysql服务器。 so, Do mysql_real_connect block whole application or just my_read_cb
因此, mysql_real_connect是阻止整个应用程序还是只是my_read_cb
according to following code 根据以下代码
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);
It blocks the whole application because the callback function my_read_cb()
is executed in the same (aka main) thread as ev_run()
function. 它阻止了整个应用程序,因为回调函数
my_read_cb()
与ev_run()
函数在同一线程(即主线程ev_run()
执行。 This is how reactor pattern works, your code should be "non-blocking" which means that you should avoid any I/O waits, sleep()
calls, mutex waits etc. It is difficult to follow such a requirement with traditional blocking code from various libraries such as MySQL driver in your case. 这就是反应堆模式的工作方式,您的代码应为“非阻塞”状态,这意味着您应避免任何I / O等待,
sleep()
调用,互斥体等待等。使用传统的阻塞代码很难满足此类要求各种库,例如MySQL驱动程序。
There are (at least) three ways how to solve it: 有(至少)三种解决方法:
getaddrinfo
family). getaddrinfo
系列中的POSIX系统DNS阻止调用相反)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.