En kanal er en model for inter-proces kommunikation og synkronisering gennem meddelelsesoverførsel i programmering. Beskeder kan sendes over en kanal, og en anden proces eller tråd, der har et link til kanalen, kan modtage en strøm af meddelelser sendt over kanalen som en strøm . Forskellige implementeringer af kanaler kan være synkrone eller asynkrone, bruge meddelelsesbuffer eller ej.
Kanaler er grundlæggende for procesberegningstilgangen og stammer fra Cooperating Sequential Processes (CSP), en formel model for samtidighed. Kanaler bruges i mange afledte programmeringssprog, såsom Occam , Limbo (via Newsqueak og Aleph -sprog ). De bruges også i libthread threading-biblioteket i C-programmeringssproget i Plan 9 OS , såvel som i Stackless Python og Go-sproget .
Kanaler, der er skabt på samme måde som CSP-modellen, er synkrone : en proces, der venter på at modtage et objekt fra en kanalblokke, indtil objektet sendes. Sådanne implementeringer kaldes "rendezvous". Typiske operationer på sådanne rør præsenteres ved hjælp af libthread-kanalgrænseflader som et eksempel:
Libthread threading - biblioteket , der oprindeligt blev oprettet til Plan 9 OS , tilbyder inter-thread-kommunikationsfunktioner gennem rør i fast størrelse.
OKaml- hændelsesmodulet implementerer indtastede kanaler til synkronisering. Når modulets sende- og modtagefunktioner kaldes, genererer de tilsvarende hændelser, der kan synkroniseres.
I XMOS giver XC-sproget en indbygget type "chan" og to operatører "<:" og ":>" til at sende og modtage data fra en kanal. [en]
Eksemplet starter to hardwaretråde i XMOS, der udfører to linjer fra "par"-blokken. Den første linje sender tallet 42 gennem røret. Den anden linje venter på, at en værdi modtages fra kanalen og skriver den modtagne værdi til x-variablen. XC-sproget understøtter også asynkron modtagelse fra kanaler ved hjælp af select-sætningen.
chan c ; int x ; par { c <: 42 ; c :> x ; }Dette stykke Go-kode opretter først kanal c, og afføder derefter en goroutine, der sender 42 gennem kanalen. Når et nummer sendes til en kanal, vil x blive sat til 42. Go tillader kanaler at buffere indhold. En ikke-blokerende modtageoperation fra en kanal er mulig ved brug af en udvælgelsesblok. [2]
c := make ( chan int ) go func () { c <- 42 }() x := <- cUd over at blive brugt til kommunikation mellem tråde, kan kanaler bruges som en primitiv til at implementere andre samtidige konstruktioner. For eksempel giver kanaler dig mulighed for at implementere futures og løfter , hvor fremtiden er en enkelt kanal, og løfte er en proces, der sender til kanalen og eksekverer fremtiden. [3] Tilsvarende kan iteratorer implementeres via rør. [fire]