Twisted - wprowadzenie: generatory (0)

We wpisie "reactor i deferred" przedstawiłem koncepcje programowania asynchronicznego z wykorzystaniem obiektu Deferred w którym kolejkowane były zadania. Taki sposób pisania może być jednak bardzo niewygodny, jeśli okaże się, że w swoim kodzie mamy wiele miejsc oczekujących na dane. Każdorazowe pojawienie się nowych informacji wymaga napisania nowej funkcji która je obsłuży. Drugie tyle, jeśli chcemy oprogramować możliwe wystąpienia błędów.

Generatory

Jaki jest generator, każdy widzi. Najprostszym przykładem może być generowanie kolejnych liczb:

>>> def gen_number(start):
...     while True:
...         start += 1
...         yield start
...         
>>> g = gen_number(2)
>>> g.next()
3
>>> g.next()
4
>>> g.next()
5

Jeśli chcesz dowiedzieć się o nich więcej, polecam prezentację "Generator Tricks for Systems Programmers".

Generatory, aż do Pythona 2.5 miały bardzo poważną wadę - były hermetyczne. Utworzony ...

Twisted - wprowadzenie: implementacja protokołu (0)

W poprzednim wpisie przedstawiłem obiekt reaktora oraz klasę Deferred. Kolejnym krokiem będzie napisanie serwera, który używając prostego protokołu będzie zwracał kod strony której adres został przesłany przez klienta.

Implementacja protokołu

Bazową klasą każdego protokołu, implementującą jedynie IProtocol jest internet.protocol.Protocol. Podstawową klasą dla wszystkich serwerów jest internet.protocol.ClientFactory:

>>> from twisted.internet import protocol, reactor
>>> 
>>> class WebGetProtocol(protocol.Protocol):
...     pass
... 
>>> class WebGetFactory(protocol.ServerFactory):
...     protocol = WebGetProtocol
...     
>>> reactor.listenTCP(9000, WebGetFactory())
<<class 'twisted.internet.tcp.Port'> of __main__.WebGetFactory on 9000>
>>> reactor.run()

Po utworzeniu instancji fabryki, przekazuję ją wraz z numerem portu jako parametr metody listenTCP obiektu reaktora. Wszelkie dane które pojawią się na tym porcie, obsłużone zostaną przez moją fabrykę.

Do połączenia z serwerem, można użyć na przykład ...

Twisted - wprowadzenie: reactor i deferred (0)

Śledząc portale i blogi o treści programistycznej, trudno nie zauważyć wzmożonego ostatnio zainteresowania "nowymi" asynchronicznymi frameworkami napisanymi w Pythonie. Osobiście staram się jednak nie podniecać każdą nowością i aby się przekonać do biblioteki, potrzebuję czegoś więcej niż 10 linijek kodu, wyświetlających Hello world. Okazało się, że nie ja jedyny.

Od jakiegoś czasu czytam o twisted i w miarę możliwości staram się napisać trochę działającego kodu. Niestety, oprócz tutoriala w którym opisane zostały podstawy, do dyspozycji jest jeszcze tylko dokumentacja API.

Ponieważ sam dużo czasu spędziłem na gromadzeniu informacji, postaram się w miarę przystępnie opisać podstawy twisted.

Reaktor

Ponieważ twisted jest asynchronicznym frameworkiem, posiada własny obiekt odpowiedzialny za zarządzanie główną pętlą programu i wywoływanie obsługi zdarzeń:

>>> from twisted.internet import reactor ...
txChat (0)

txChat to napisany w twisted i jQuery czat. Kiedyś, ktoś napisał w twisted podobną aplikację, której działanie polegało na wymuszaniu ciągłego przeładowywania strony. Kod miał być wydajnościowym PoC twisted. Uruchomiony na słabej maszynie, obsługiwał całkiem sporą liczbę zapytań. Pomyślałem, że napiszę coś podobnego, ale uproszczę sobie i serwerowi zadanie, używając Javascript.

« 2 1 /1 0 »