Raku Land



use this to obtain great parallel powers. also to alleviate the headache that comes with queues and managing workers.

Mux.new(:callable, :channels)

:callable should be something callable. this is the method you write that is going to do all of your work for you and it should take one argument. eg. sub ($elem) { }

:channels this should be the maximum level of parallelization that you'd like. defaults to int(max_threads / 1.5). this will warn but not puke if you specify higher than max_threads parallelization and be warned that if you exceed the scheduler you may find your application locked.


this sets what demuxes the return values from your workers should you so need them.

my Mux $m .=new( :callable(sub (Int() $x) { $x * 2; }), ); $m.demux(-> $rval { #rval will be 2, then 2, then 4, then 6, etc }); $q.start: 1,1,2,3; #etc;


this is a sub ($error) { } to be called when there is an unhandled error in the worker (if it's not in your sub then please open a ticket).


this is a sub (Mux:D) { } called when the work queue is complete.


for pausing the queue, you can still feed the muxer but don't put your fingers in its mouth.


will let you know if the muxer is paused


let's the hedonistic muxer consume


lets you know whether you should keep your hands away from the cage


finally, if you want to block until the muxer is done processing the queue

.feed(*@ )

you can feed the muxer while its running, this will not reset the queue or alter current processing but it will cause .drain to be called later