On Sat, May 21, 2011 at 10:25:45PM -0400, Aaron Boxer <[email protected]> wrote: > I found sample code that allows me to read and write from the socket > using libev I/O events. > But, I am not sure how to handle the read from NAS and processing. > This could take some time. > And I don't want to block the server while this is happening.
In general, what you do is enable non-blocking I/O, and then you have to implement buffering, i.e. when you know there is readable data, you try to read a good sized amount (e.g. 4096) into some buffer and then you try to parse out your requests, keeping partial requests in the buffer for the next read. If you are experienced doing that it will not pose any problems, if not, it can be a time-consuming task to get the details right the first time, and naked libev doesn't help with any of the buffering. It is, however, more flexible, and instructive, an you cna cut corners you might not be abel to cut with a generic library. Also, for writing, you need to do the same, as the socket wil only accept so and so much data per time. Recently somebody posted details about a networking library on top of libev (https://github.com/coolaj86/libevn - haven't looked at it in detail, presumably it handles buffering for you). There is also libevent (which I wouldn't recommend in itself), which is weird, but it presumably has quite powerful and full-featured buffer handling for sockets. > Should this be done in another thread, and have the thread send the > image data back to the client? If you have only a few clients at a time, and locking is easy, then threads might be simpler. If you have many clients, you probably want to use something like libev. If you have even more and locking is easy, you might want to have one thread per cpu core using libev, and if you have even more clients you need to run with many processes, potentially on different hosts. All depends on how much effort you want (or have to) go. > I was planning on using a thread pool. But, perhaps libev can support > a processing step without > blocking? Yes, libev is quite ideally suited for this problem as it efficiently gives you events on when data is ready to be read or written. It does only work on non-blocking handles though, files would always be ready (because the data is there), so if you want to do files in an event-based way, you could look at libeio (which implements a thread pool for I/O). -- The choice of a Deliantra, the free code+content MORPG -----==- _GNU_ http://www.deliantra.net ----==-- _ generation ---==---(_)__ __ ____ __ Marc Lehmann --==---/ / _ \/ // /\ \/ / [email protected] -=====/_/_//_/\_,_/ /_/\_\ _______________________________________________ libev mailing list [email protected] http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
