The parallel\Channel classUnbuffered ChannelsAn unbuffered channel will block on calls to parallel\Channel::send until there is a receiver, and block on calls to parallel\Channel::recv until there is a sender. This means an unbuffered channel is not only a way to share data among tasks but also a simple method of synchronization. An unbuffered channel is the fastest way to share data among tasks, requiring the least copying. Buffered ChannelsA buffered channel will not block on calls to parallel\Channel::send until capacity is reached, calls to parallel\Channel::recv will block until there is data in the buffer. Closures over ChannelsA powerful feature of parallel channels is that they allow the exchange of closures between tasks (and runtimes). When a closure is sent over a channel the closure is buffered, it doesn't change the buffering of the channel transmitting the closure, but it does effect the static scope inside the closure: The same closure sent to different runtimes, or the same runtime, will not share their static scope. This means that whenever a closure is executed that was transmitted by a channel, static state will be as it was when the closure was buffered. Anonymous ChannelsThe anonymous channel constructor allows the programmer to avoid assigning names to every channel: parallel will generate a unique name for anonymous channels. Class synopsisparallel\Channel
final
class parallel\Channel
{
/* Anonymous Constructor */
public __construct()
public __construct(int
$capacity )/* Access */
public Channel make(string
$name )public Channel make(string
$name , int $capacity )public Channel open(string
$name )/* Sharing */
public mixed recv()
public void send(mixed
$value )/* Closing */
public void close()
/* Constant for Infinitely Buffered */
const
Infinite;
}
|