Kanal (programmering)

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 .

Kanalimplementeringar

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

Libthread threading - biblioteket , som ursprungligen skapades för Plan 9 OS , erbjuder kommunikationsmöjligheter mellan trådar genom rör med fast storlek.

OKaml-händelser

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.

Exempel

XMOS XC

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

Go-språket

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

Applikationer

Fö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]

Anteckningar

  1. XMOS-programmeringsguide (inte tillgänglig länk) . Hämtad 4 augusti 2016. Arkiverad från originalet 4 mars 2016. 
  2. Effektivt Go-The Go-programmeringsspråk . Hämtad 4 augusti 2016. Arkiverad från originalet 6 januari 2015.
  3. " Futures Archived 4 December 2020 at the Wayback Machine ", Go Language Patterns Archived 11 November 2020 at the Wayback Machine
  4. " Iterators Arkiverade 15 oktober 2020 på Wayback Machine ", Go Language Patterns Arkiverade 11 november 2020 på Wayback Machine

Länkar