Professional Documents
Culture Documents
Mikoaj Olszewski
Dotychczasowy styl
Aplikacja w terminalu (konsola/screen) Komunikaty na standardowym wyjciu Jeden proces, jeden wtek Obsuga pojedynczego klienta
rodowisko uruchomieniowe
Logowanie
In [1]: import logging logging.basicConfig(filename='example.log',level=logging.DEBUG) log = logging.getLogger(__name__) log.error('the system is down') ERROR:__main__:the system is down
Poziomy logowania
DEBUG INFO WARNING ERROR CRITICAL
Demonizacja
Demon proces dziaajcy w tle, niezaleny od terminala i uytkownika pena lista funkcjonalnoci Biblioteka python-daemon $$ pip install python-daemon
Prosty przykad
Peny przykad
rda $$ python demon.py start|stop|restart
Obsuga klientw
Przykadowy problem
Klient: pytanie ( ?) Serwer: odpowied ( . lub !) Katechizm polskiego dziecka Cz wsplna
Klient
1. Poczenie z serwerem 2. Wysanie pytania 3. Oczekiwanie na pen odpowied 4. Wypisanie odpowiedzi 5. Zamknicie poczenia rda
Prosty serwer
1. Akceptacja poczenia 2. Oczekiwanie na zakoczenie pytania 3. Znalezienie odpowiedzi 4. Wysanie odpowiedzi 5. Po zakoczeniu danego poczenia obsuenie nowego rda
Porwnanie
ledzenie
my_trace.py $python my_trace.py handle_client simple_server.py $ python my_trace.py client client.py host
localhost
34.229911 34.229963 34.230056 34.230059 34.230062 34.230092 34.230201 34.230243 34.230246 34.230381 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((hostname, port)) answers = [] for row in katechizm.qa: sock.sendall(row[0]) answer = katechizm.recv_until(sock, ['.', '!']) question = katechizm.recv_until(client_sock, ['?']) answer = katechizm.qadict[question] client_sock.sendall(answer) answers.append(answer)
tunel
ssh -N -R 4445:localhost:4444 ja@zdalny ssh -N -L 4445:localhost:4445 ja@zdalny 21.760634 21.760674 21.761172 21.761175 21.761178 21.761205 21.762027 21.762964 21.762967 21.763361 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((hostname, port)) answers = [] for row in katechizm.qa: sock.sendall(row[0]) answer = katechizm.recv_until(sock, ['.', '!']) question = katechizm.recv_until(client_sock, ['?']) answer = katechizm.qadict[question] client_sock.sendall(answer) answers.append(answer)
Benchmark
(venv)$ pip install funkload Test (venv)$ fl-run-bench tests.py TestKatechizm.test_dialog Konfiguracja benchmarku (venv)$$ KATECHIZM_SERVER=host fl-run-bench tests.py TestKatechizm.test_dialog (venv)$$ fl-build-report --html -o output bench.xml
Zakrcony serwer
Twisted Serwer zdarzeniowy Podobny do node.js Dua liczba dodatkw / protokow rda
SocketServer
Modu SocketServer TCPServer / UDPServer ForkingMixIn / ThreadingMixIn Automatyczna kreacja wtkw / procesw przy akceptacji poczenia rda
SocketServer wyniki
Podsumowanie
Profesjonalny serwer zdemonizowany z logowaniem obsugujcy wielu klientw na raz Zwikszenie wydajnoci serwera mechanizm zdarze wtki / procesy load balancing