En kanal är en modell för kommunikation mellan processer och synkronisering genom meddelandeöverföring i programmering. Meddelanden kan skickas över en kanal, och en annan process eller tråd som har en länk till kanalen kan ta emot en ström av meddelanden som skickas över kanalen som en ström . Olika implementeringar av kanaler kan vara synkrona eller asynkrona, använda meddelandebuffring eller inte.
Kanaler är grundläggande för processkalkylmetoden och har sitt ursprung i Cooperating Sequential Processes (CSP), en formell modell för samtidighet. Kanaler används i många härledda programmeringsspråk som Occam , Limbo (via Newsqueak och Aleph -språk ). De används också i libthread threading-biblioteket i programmeringsspråket C i Plan 9 OS , såväl som i Stackless Python och Go-språket .
Kanaler, skapade på liknande sätt som CSP-modellen, är synkrona : en process som väntar på att ta emot ett objekt från ett kanalblock tills objektet skickas. Sådana implementeringar kallas "rendezvous". Typiska operationer på sådana rör presenteras med hjälp av libthread-kanalgränssnitten som ett exempel:
Libthread threading - biblioteket , som ursprungligen skapades för Plan 9 OS , erbjuder kommunikationsmöjligheter mellan trådar genom rör med fast storlek.
Ocaml -händelsemodulen implementerar typade kanaler för synkronisering. När modulens sändnings- och mottagningsfunktioner anropas genererar de motsvarande händelser som kan synkroniseras.
I XMOS tillhandahåller XC-språket en inbyggd typ "chan" och två operatörer "<:" och ":>" för att skicka och ta emot data från en kanal. [ett]
Exemplet startar två hårdvarutrådar i XMOS, och kör två rader från "par"-blocket. Den första raden skickar siffran 42 genom röret. Den andra raden väntar på att ett värde ska tas emot från kanalen och skriver det mottagna värdet till variabeln x. XC-språket stöder också asynkron mottagning från kanaler med hjälp av select-satsen.
chan c ; int x ; par { c <: 42 ; c :> x ; }Denna del av Go-koden skapar först kanal c, och skapar sedan en goroutine som skickar 42 genom kanalen. När ett nummer skickas till en kanal ställs x till 42. Go tillåter kanaler att buffra innehåll. En icke-blockerande mottagningsoperation från en kanal är möjlig med hjälp av ett valblock. [2]
c := make ( chan int ) go func () { c <- 42 }() x := <- cFörutom att användas för kommunikation mellan trådar, kan kanaler användas som en primitiv för att implementera andra samtidiga konstruktioner. Till exempel låter kanaler dig implementera framtider och löften , där framtiden är en enkelkanal och löfte är en process som skickar till kanalen och verkställer framtiden. [3] På liknande sätt kan iteratorer implementeras via rör. [fyra]