Further to this, I've just added the following to the documentation of Thread::Conveyor and uploaded it to CPAN:
Why would you use Thread::Conveyor over Thread::Queue::Any? Well, Thread::Conveyor has the following extra features:
- It works with Perl 5.8.0
- Shared arrays leak memory very badly in Perl 5.8.0. Therefore, you cannot
really use Thread::Queue in Perl 5.8.0, and consequently cannot use
Thread::Queue::Any in any type of production environment.
- It provides throttling
- A thread that enqueues very many values quickly, can cause a large amount of
memory to be used. With throttling, any thread that enqueues will have to
wait until there is "room" on the belt again before continuing. See methods
"minboxes" and "maxboxes".
- You can check for a new value without removing it from the belt
- Sometimes it can be nice to check whether there is a new value on the belt
without actually removing it from the belt. See the "peek" and "peek_dontwait"
- You can reset the entire belt
- Sometimes you want to be able to reset the contents of the belt. See the
"clean" and "clean_dontwait" methods for that.
- You can get everything from the belt in one go
- Sometimes you want everything that's on the belt in one go. That can also
ba accomplished with the "clean" and "clean_dontwait" methods.