2017-03-09 10 views
1

libev를 사용하여 이벤트 기반 앱을 개발합니다. 나는 이벤트 내에서 원격 mysql 서버를 쿼리하고 싶다. 그래서 다음 코드에 따른 mysql_real_connect() 함수를 블록 전체 응용하거나 my_read_cblibev 이벤트 콜백 함수 내에서 블로킹 함수를 호출하면 전체 어플리케이션을 차단합니까?

를 수행

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); 

답변

1
콜백 함수 my_read_cb() 동일한 (일명 주) 스레드 실행

그 블록 전체 애플리케이션 때문에 ev_run() 기능입니다. 이것은 reactor pattern이 작동하는 방식이며, 코드는 "비 차단"이어야합니다. 즉, I/O 대기, sleep() 호출, 뮤텍스 대기 등을 피해야합니다. 다양한 라이브러리의 전통적인 차단 코드로 이러한 요구 사항을 따르는 것은 어렵습니다 귀하의 경우에는 MySQL 드라이버와 같은.

이 있습니다 그것을 해결하는 방법 세 가지 방법 (최소) :

  • 이벤트 루프가 수시로 차단된다는 사실에 동의합니다. 일부 앱에서는 큰 문제가 아닐 수도 있습니다.
  • proactor pattern 구현 - 기본적으로 각 처리기 콜백은 주 스레드와 다른 작업자 스레드에서 실행되므로 이벤트 루프가 차단되지 않습니다. 이것은 Node.js가 제공하거나 C 세계에서 libuv 등입니다.
  • 이벤트 루프와 호환되는 라이브러리의 비동기/비 차단 구현을 찾으십시오. 특히 여기에서 운이 좋을 필요가 있습니다. 예는 다음과 같습니다. 비동기 DNS 해석을위한 https://c-ares.haxx.se (getaddrinfo 계열의 POSIX 시스템 DNS 차단 호출과 대조).