↓ Skip to main content

Twisted

·464 words

Ik ben in een opwelling gisteravond begonnen om mijn eigen blog-software te schrijven. Niet echt omdat ik het nodig heb, maar om beter bekend te raken met een paar hele krachtige en ondergewaardeerde libraries (SQLObject & Twisted).

SQLObject is erg gemakkelijk in het gebruik. Ik had niet echt zin om Foreign Key Constraints in PostgreSQL uit te gaan zoeken en dat hoeft dus ook niet.

Twisted is een ander verhaal. Het is een super-stoer raamwerk met best veel documentatie die niet erg helder is. Dat was wel fijn geweest want de opzet is erg complex en vereist een hele andere manier van denken.

Update: Hieronder volgt een heleboel nerd-praat over hoe en wat het werkt maar mijn indruk van Twisted komt overeen met mijn verwachtingen.

Twisted is erg groot, er zijn delen die erg volwassen zijn en andere delen die nog ontzettend in ontwikkeling zijn.

Er straalt van alles (behalve de documentatie) of dat het gemaakt is door mensen die weten wat ze doen. Het nette ontwerp, de volwassen admintools etc. dat zit allemaal heel goed in elkaar.

En ook al lijkt het moeilijk, als je de voorbeelden volgt zijn er ook veel dingen die ontzettend makkelijk worden gemaakt. Ik heb een voorbeeld overgenomen, een irc-bot van een paar(!) regels code, en dat uitgebreid zodat je er galgje mee kunt spelen.

Daar komt de Python-filosofie wel om de hoek kijken: makkelijke dingen makkelijk en complexe dingen mogelijk maken.

Uitleg: In een normaal programma voer je gewoon dingen uit:

doeIets()

doeIetsWaarJeLangOpMoetWachten()

doeNogIets()

En als je dat lange wachten niet ziet zitten dan start je een Thread die dat parallel voor je doet zodat jij gewoon door kunt gaan met doeNogIets(). Zo gebeurt het overal, maar dat gaat bij Twisted niet op.

Twisted heeft maar één Thread (want dat is efficienter), nog een Thread starten is niet de bedoeling, lang wachten ook niet. Bovenstaande code moet je dan omklussen tot:

def alsHetKlaarIs(resultaat):

    doeIetsMet(resultaat)

doeIets()

belofte = ikGaDoorIkHoorHetWelAlsHetKlaarIs()

belofte.addCallback(alsHetKlaarIs)

doeNogIets()

De aanroep naar ikGaDoorIkHoorHetWelAlsHetKlaarIs() komt meteen terug en doet ons een belofte (een Deferred).

Aan die belofte vragen we om op de hoogte gehouden te worden. Dat doet hij door als het dan klaar is alsHetKlaarIs() aan te roepen.

Dit lijkt heel makkelijk, maar valt in de praktijk vies tegen. Je moet ten eerste compleet anders denken. Verder moet je de databasetoegang zo schrijven dat een SELECT Deferreds teruggeeft en je daar in de rest van je applicatie mee uit de voeten kunt.

De documentatie ‘Using Deferreds’ hielp me niet echt, maar deze draad uit de mailinglis wel.

Wat het niet makkelijker maakt is dat ze in Twisted ook een heldere scheiding van de verantwoordelijkheden hebben geïmplementeerd met adaptatie en aspecten. Dit is op het eerste gezicht niet superhelder maar belooft later wel veel ellende te besparen.

Alper Cugun
Author
Alper Cugun

Related

Lumineus

·140 words
Vandaag op Slashdot —dus niet echt nieuw— maar daarom nog niet minder gaaf. Veel ontwikkeling van Gnome vindt plaats bij Novell maar deze Seth Nickell werkt bij Red Hat.