A classe parallel\Channel

(0.9.0)

Channels sem buffer

Um channel sem buffer bloqueará chamadas para parallel\Channel::send() até que haja um receptor e bloqueará chamadas para parallel\Channel::recv() até que haja um remetente. Isso significa que um channel sem buffer não é apenas uma forma de compartilhar dados entre tarefas, mas também um método simples de sincronização.

Um channel sem buffer é a maneira mais rápida de compartilhar dados entre tarefas, exigindo menos cópias.

Channels em buffer

m canal em buffer não bloqueará chamadas para parallel\Channel::send() até que a capacidade seja atingida, chamadas para parallel\Channel::recv() serão bloqueadas até que haja dados no buffer.

Closures sobre Channels

Uma característica poderosa dos channels paralelos é que eles permitem a troca de closures entre tarefas (e tempos de execução).

Quando um closure é enviado através de um channel, o closure é armazenado em buffer, isso não altera o buffer do channel que transmite o closure, mas afeta o escopo estático dentro do closure: O mesmo closure enviado para tempos de execução diferentes, ou o mesmo tempo de execução, não compartilharão seu escopo estático.

Isso significa que sempre que for executado um closure transmitido por um channel, o estado estático será o mesmo de quando o closure foi armazenado em buffer.

Channels Anônimos

O construtor de channel anônimo permite ao programador evitar atribuir nomes a cada channel: parallel gerará um nome exclusivo para channels anônimos.

Resumo da classe

final class parallel\Channel {
/* Construtor Anônimo */
public __construct()
public __construct(int $capacity)
/* Acesso */
public make(string $name): Channel
public make(string $name, int $capacity): Channel
public open(string $name): Channel
/* Compartilhamento */
public recv(): mixed
public send(mixed $value): void
/* Encerramento */
public close(): void
/* Constante para Buffer Infinito */
const Infinite;
}

Table of Contents