- 论坛徽章:
- 0
|
libev的reactor模式的读写通过回调实现,一般为了不阻塞loop,把socket设置成non-block模式。
一般的业务流程是: 在read_callback中接收协议数据---处理数据---设置write_event,然后在write_callback中发送处理后的结果。
现在的问题是,处理数据的时间较长,为了不影响loop,不放在read_callback中处理,塞入队列,由另外一个线程去pop队列并处理,但处理部分需要发送处理后的结果,
一个方法是可以在处理线程中设置对应的ev_io的write_event,但是问题是,在这之前或期间,如果对端关闭socket, ev_io会接收read事件,并销毁该ev_io。
一个解决方法是接收到一个协议之后,不再设置read_event,那就接收不到read result=0的消息,等到write_event之后再设回read_event;副作用是该socket只能一次接收一个协议,处理后才能接收第二个。
另一个方法是发送数据不放在ev_io的write_callback中,只把socket句柄给队列,并提供一个封装的send函数(处理EAGAIIN or EWOULDBLOCK or EINTR),让处理线程去发送。如果是这种方式的话,write_callback就没用了。
不知道大伙有什么其他好的方法? |
|