Actually, I'm using evhttp for processing the requests. Pretty much stock libevent if you're using the latest version, and only minor thread-safety issues in the really old versions and then only for outbound HTTP connections.

Chris Ross wrote:

Thanks for the information.

Since the first post, I have implemented a dedicated listening/reading thread with libevent with a pool of worker threads. The incoming requests are read, packaged and handed over to a thread (knows nothing of libevent) which will then perform the request and then write the data back and go back to sleep. Seems to work nicely. It did require me to write my own http server but hey - such is life.

Chris

On 4 Sep 2008, at 17:20, Tani Hosokawa wrote:

FWIW, I have written a similar system which uses a dedicated accept thread and a pool of read/write threads (1 per CPU) and it works fine with over 20000 concurrent connections. Using a thread per connection is the exact opposite of what event based processing is intended for.

Jonathan Hohle wrote:
I have recently added some code to do the following: - Setup a worker pool of threads that sit waiting on a condition variable. - The main thread takes the request struct and puts it in to the queue of a thread, wakes the thread up and asks the thread to deal with it. - Main thread returns to even processing. - Thread answers the request and then goes back to sleep. The problem I have is that it'll process one request and then stop.

...but I wondered if anyone had any words of wisdom.
I don't know if this helps or not, but I recently set up a app with a similar architecture. Originally it used a single event base which handled accepts and reads. I thought: why don't I just separate those into separate threads (in my case a single accept thread, and multiple read threads, with round-robin event queuing).

Things went well *until* I had more concurrent connections than I had reader threads. I banged my head over my locking strategy for several days, but finally came to the conclusion that event_add/event_base_loop are not thread safe (at least in libevent 1.4.x).

In the typical case, you're adding events either in an event handler callback, or before the event loop has begun. In a case with multiple threads and multiple event loops, there is no clear indication of when an event is added to the queue. (Someone please correct me if I'm wrong).

I can't find the tab atm, but I have seen some discussion about multi-threading support being present in trunk. I haven't gotten trunk to build yet, however. For now I think I'm going to revert to a single queue, giving priority to read events.

On the other hand, having a per-connection thread with its own event queue works perfectly fine (in my experience). Under heavy load, however, you can spawn a lot of threads ;)

Jonathan Hohle
smtp: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
pstn: 480.505.8800_.4324
voip: 4324
cdma: 480.323.5799
<><



------------------------------------------------------------------------

_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users


_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users


_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users

Reply via email to