Coroutines er dybest set funktioner, hvis udførelse kan pauses/suspenderes på et bestemt tidspunkt, og så kan vi genoptage udførelsen fra det samme punkt senere, når vi vil.

vi har brug for en mekanisme — eller for at være mere præcis, et nøgleord — hvormed vi kan indsætte et kontrolpunkt og fortælle programmet, at vi vil sætte udførelsen af funktionen på pause her og returnere kontrol til det punkt, den kaldte fra. Vi genoptager henrettelsen, når vi vil.

i Python kan vi sætte udførelsen af en funktion på pause ved hjælp af nøgleordet yield.

så her er hvor tingene bliver interessante:

  • vi kan tænke på en coroutine som en funktion, der har et eller flere kontrolpunkter, hvor udførelsen vil blive sat på pause, og kontrollen returneres til det punkt, hvor den blev kaldt fra.
  • i det væsentlige er en coroutine en funktion opdelt i mange dele, og vi kan udføre hver del af en coroutine, når vi udfører hver iteration af en for loop ved hjælp af funktionen next.

her er et grundlæggende eksempel:

OUTPUT :<class 'generator'>
Function Starts
Function Ends

fra output bemærker vi et par ting:

  • først skal vi ringe til coroutine/funktionen, der giver os et generatorobjekt.
  • det generatorobjekt vil opføre sig på samme måde som en iterator, men i tilfælde af en iterator krydser vi over en iterabel. Med en generator udfører vi dele af coroutinen.
  • ligesom en StopIteration undtagelse kastes og fanges bag kulisserne i A For loop, sker det samme i dette tilfælde, når den sidste del af coroutinen udføres.

nu er denne pause af funktionen imellem meget interessant og åbner nogle muligheder:

  • når funktionen er sat på pause, gør vi intet, hvilket er tilfældet, som vi lige så.
  • Antag, at en variabel ændres flere gange i en funktion, og vi ønsker værdien af den pågældende variabel ved et bestemt kontrolpunkt. Så når vi sætter denne funktion på pause på det pågældende kontrolpunkt, returnerer det værdien af den variabel.

lad os se et eksempel:

OUTPUT :Function Part 1
5
Function part 2
12
Function part 3

her returneres værdien x af yield ved forskellige kontrolpunkter, da funktionsudførelsen er sat på pause.

når vi udfører den sidste del af funktionen, og der ikke er noget udbytte tilbage i funktionen, efter at have udført den sidste del, hæves en StopIteration undtagelse.

ligesom når en iterator forsøger at udføre den næste funktion, men der er ikke flere elementer tilbage i iterable, det hæver også StopIteration undtagelsen.

  • Antag, at vi vil sende en værdi (som kan være en konstant eller variabel) ved et bestemt kontrolpunkt (dvs.ved en bestemt tilstand af en funktion). Vi kan også gøre det ved hjælp af nøgleordet yield. Når vi vil sende en værdi, bruger vi funktionen send i stedet for next.

lad os se et eksempel:

OUTPUT :Function part 1
6
Function part 2
12
Function part 3

årsagen til, at vi brugte next før vi brugte send, er, at vi kun kan bruge send, når vi er ved yield kontrolpunktet, og yield er på højre side af udtrykket. Så for at nå den første yield, skal vi bruge next funktionen.

nu kommer her en interessant anvendelse af coroutines. Antag, at vi vil skifte frem og tilbage mellem to funktioner, som vi gør i multithreading. I multithreading, indtil en interrupt er stødt på af operativsystemet, vil den fortsætte med at udføre. I dette tilfælde kan vi skifte, når vi vil.

lad os se et eksempel:

OUTPUT :Function 1 part 1
Function 2 part 1
Function 1 part 2
Function 1 part 3
Function 2 part 2
Function 2 part 3
Function 2 part 4
Function 1 part 4
Function 1 part 5

i dette eksempel kan vi se, at vi kan skifte frem og tilbage mellem coroutines, når vi vil.

så hvis vi skriver vores egen brugerdefinerede planlægger, der håndterer skiftet mellem flere coroutiner, kan vi opnå med enkelttrådning, hvad vi gør med multithreading.

Coroutines har mange applikationer såsom samtidighed og andre programmeringsmønstre kan også implementeres, som producent-forbruger eller afsender-modtager i netværksprogrammering. Jeg vil undersøge dem i kommende artikler.

Coroutines er også byggestenene i mange rammer som asyncio, snoet, aiohttp. De kan også kædes sammen for at lave rørledninger og løse problemer.