The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Coro::PrioChannel::Multi - Multiple-listener priority message queues for Coro

VERSION

version 0.005

SYNOPSIS

    use Coro::PrioChannel::Multi;

    my $q = Coro::PrioChannel::Multi->new($maxsize);
    $q->put("xxx"[, $prio]);

    my $l = $q->listen();
    print $l->get; # from Coro::PrioChannel

DESCRIPTION

A Coro::PrioChannel::Multi is exactly like Coro::PrioChannel, but with the ability to add (and lose) listeners.

Unlike Coro::Channel, you do have to load this module directly.

Each item that is put into the channel will get sent to all listener(s). However, there is no deep copy here, if the item put in is a reference, all listeners will receive a reference to the same object, which will allow each listening thread to modify it before the next thread sees it. This could be construed as a feature.

Messages put into the channel before any listener is set up will be lost. Messages put into the channel before a listener is set up will not be resent to that listener, even if the message is still in some other listener's channel.

METHODS

new

Create a new multi-channel with the given maximum size. Giving a size of one defeats the purpose of a priority queue. However, with multiple listeners, this should ensure that each listener deals with the item before we add the next item.

clean

Clears out any channels that have gone away. Shouldn't normally be needed as the object will generally self-clean.

The concept is that a listener may no longer be interested, and has let its channel listener go out of scope, which will leave a hole in the list of listeners. This method simply clears out the holes.

number_of_listeners

Returns a count of the number of listeners still attached to this channel.

listen

Set up a new listener for the channel. Returns a Coro::PrioChannel object that you issue a ->get against. For example:

    my $l = $cpcm->listen();
    while (my $item = $l->get())
    {
        #...
    }
put

Pass a message to all (current) listeners. Optionally provide a priority between Coro::PRIO_MIN and Coro::PRIO_MAX.

AUTHOR

Darin McBride <dmcbride@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Darin McBride.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.