Utvidga¶
Den huvudsakliga inriktningen för asyncio
-utvidgning är att skriva anpassade event loop-klasser. Asyncio har hjälpmedel som kan användas för att förenkla denna uppgift.
Anteckning
Tredje part bör återanvända befintlig asynciokod med försiktighet, en ny Python-version är fri att bryta bakåtkompatibilitet i intern del av API.
Skriva en anpassad händelseslinga¶
asyncio.AbstractEventLoop
deklarerar väldigt många metoder. Att implementera dem alla från grunden är ett tråkigt jobb.
En loop kan få många vanliga metoder implementerade gratis genom att ärva från asyncio.BaseEventLoop
.
Efterträdaren ska i sin tur implementera ett antal privata metoder som deklarerats men inte implementerats i asyncio.BaseEventLoop
.
Till exempel kontrollerar loop.create_connection()
argument, löser DNS-adresser och anropar loop._make_socket_transport()
som bör implementeras av en ärvd klass. Metoden _make_socket_transport()
är inte dokumenterad och betraktas som ett internt API.
Privata konstruktörer för Future och Task¶
asyncio.Future
och asyncio.Task
bör aldrig skapas direkt, använd istället motsvarande loop.create_future()
och loop.create_task()
, eller asyncio.create_task()
fabriker.
Tredjeparts händelseslingor kan dock återanvända inbyggda framtids- och uppgiftsimplementeringar för att få en komplex och mycket optimerad kod gratis.
För detta ändamål listas följande, privata konstruktörer:
- Future.__init__(*, loop=None)¶
Skapa en inbyggd framtida instans.
loop är en valfri instans för händelseslinga.
- Task.__init__(coro, *, loop=None, name=None, context=None)¶
Skapa en inbyggd uppgiftsinstans.
loop är en valfri instans för händelseslingan. Resten av argumenten beskrivs i beskrivningen av
loop.create_task()
.Ändrad i version 3.11: context-argumentet läggs till.
Stöd för uppdragets livslängd¶
En tredjepartsuppgiftsimplementering bör anropa följande funktioner för att hålla en uppgift synlig för asyncio.all_tasks()
och asyncio.current_task()
:
- asyncio._register_task(task)¶
Registrera en ny task som hanteras av asyncio.
Anropa funktionen från en task-konstruktör.
- asyncio._unregister_task(task)¶
Avregistrera en task från asyncio interna strukturer.
Funktionen ska anropas när en uppgift är på väg att avslutas.
- asyncio._enter_task(loop, task)¶
Byt den aktuella uppgiften till argumentet task.
Anropa funktionen precis innan du utför en del av en inbäddad coroutine (
coroutine.send()
ellercoroutine.throw()
).
- asyncio._leave_task(loop, task)¶
Byt tillbaka den aktuella uppgiften från task till
None
.Anropa funktionen precis efter att
coroutine.send()
ellercoroutine.throw()
har körts.