Kanal (programmering)

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 .

Kanalimplementeringer

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-kanaler

Libthread threading - biblioteket , der oprindeligt blev oprettet til Plan 9 OS , tilbyder inter-thread-kommunikationsfunktioner gennem rør i fast størrelse.

OKaml begivenheder

OKaml- hændelsesmodulet implementerer indtastede kanaler til synkronisering. Når modulets sende- og modtagefunktioner kaldes, genererer de tilsvarende hændelser, der kan synkroniseres.

Eksempler

XMOS XC

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 ; }

Go-sproget

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 := <- c

Ansøgninger

Ud 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]

Noter

  1. XMOS-programmeringsvejledning (ikke tilgængeligt link) . Hentet 4. august 2016. Arkiveret fra originalen 4. marts 2016. 
  2. Effektivt Go-The Go-programmeringssprog . Hentet 4. august 2016. Arkiveret fra originalen 6. januar 2015.
  3. " Futures Arkiveret 4. december 2020 på Wayback Machine ", Go Language Patterns Arkiveret 11. november 2020 på Wayback Machine
  4. " Iterators Arkiveret 15. oktober 2020 på Wayback Machine ", Go Language Patterns Arkiveret 11. november 2020 på Wayback Machine

Links