Vlákna a internetové protokoly Co to jsou vlákna Vlákna jsou samostatné procesy, které sdílejí stejný adresový prostor. Vlákna jsou na sobě nezávislá. Pokud se stane, že jedno vlákno změní proměnou, ihned se nastane změna proměnné u ostatních vláken. Někdy je tato vlastnost vláken nežádoucí a proto se vlákna synchronizují. U synchronizace vláken se využívá zámků vláken. Tento zámek může nabývat dvou stavů a to je stav odemčeno a zamčeno. Princip toho zámku je jednoduchý. Pokud potřebujeme, aby nedošlo ke změně proměnné u ostatních vláken, dané vlákno zamkneme a poté co se skončí dané vlákno, můžeme ho odemknout a teprve poté bude provedena změna u ostatních proměnných v dalších vláknech.
Jak pracovat s vlákny Pro práci s vlákny máme v Pythonu dva moduly. Jeden modul thread a další je modul threading. Modul thread je určen pro vytváření nových vláken a použití jednoduchých zámků. Tento modul poskytuje jenom nízkoúrovňovou práci s vlákny a nad tímto modulem je modul threading. Nejznámější a nepoužívanější funkcí je funkce start new thread(). Této funkci musíme předat do argumentu funkci, která se má vykovávat ve vlákně a následně za touto funkcí jako další argument může následovat seznam pozičních argumentů a následně asociativní pole argumentů. Systém poznávání vláken v programu je takový, že každé vlákno má přiřezeno svoje číslo, které není stejné s jiným vláknem. Každé vlákno má tedy svoje číslo, podle kterého lze poznat o jaké se jedná vlákno. Pokud ovšem jedno vlákno skončí, může číslo po vlákně, které skončilo dostat stejné číslo nové vlákno. Toto číslo vlákna lze zjistit funkcí thread.get ident(). Vlákno lze ukončit funkcí thread.exit(). Modul threading nabízí mnohem více funkcí než modul thread. Nabízí pohodlnou práci s vlákny. Ukážeme si na příkladě použití vláken s modulem threading. >>> import threading >>> import time >>> zamek = threading.Lock() >>> ... ... ... ... ... ...
def vlaknoprvni(): zamek.acquire() for i in range(5): print ’vlakno prvni’ time.sleep(0.3) zamek.release()
-1-
>>> def vlaknodva(): ... zamek.acquire() ... for i in range(10): ... print ’vlakno1’ ... time.sleep(0.1) ... zamek.release() ... >>> v1 = threading.Thread(target = vlaknoprvni) >>> v2 = threading.Thread(target = vlaknodva) >>> v1.start(); v2.start
Síťové programování Síťovým programováním se rozumí programování pomocí využití jednotlivých internetových protokolů. Ukážeme i práci s protokolem SMTP, FTP a HTTP. Protokol SMTP slouží k posílání elektronické pošty přes internet. Protokol HTTP slouží pro internetové stránky. Prokol FTP slouží k přenosu souboru po internetu. Práce s protokolem SMTP V Pythonu se na práci s protokolem SMTP využívá modul smtplib, který poskytuje dostatek funkcí pro pohodlnou práci s tímto protokolem. Funkce jsou velice jednoduché a myslim, že z příkladu jsou zcela pochopitelné. Využívá se metody sendmail().Tato metoda má důležité argumenty:
adresa odesílatele e-mailu adresa adresáta e-mailu vlastní tělo e-mailu včetně hlaviček Další důležitou funkcí je uzavření kominice s SMTP serverem. Na to slouží metoda quit(). Nyní je ukázka programu, který odesílá maily.
-2-
import smtplib import sys od = raw_input(’Od: ’) pro = raw_input(’Pro: ’) predmet = raw_input(’Predmet: ’) msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (od, pro, predmet)) print "Zadejte text zprávy, ukoncete stiskem ^D na samotném rádku:" msg += sys.stdin.read() server = smtplib.SMTP(’localhost’) server.sendmail(od, pro, msg) server.quit()
Protokol FTP Pro použití protokolu v Pythonu je určen modul ftplib. Tento modul už je trochu náročnější na práci oproti předcházejícímu. • •
sendcmd(příkaz) – zašle serveru příkaz a vrátí odpověď retrlines(příkaz, funkce) – zašle serveru příkaz a začne stahovat odpověď na příkaz v textovém módu • dir(adresář, funkce) – zašle FTP serveru příkaz a výsledek přečte v textovém módu • quit() – ukončí se spojení se serverem
Protokol HTTP Pro celkovou komunikaci na protokolu HTTP slouží modul httplib. Ten je rozdělen na dvě třídy. HTTPConnection – odpovídá na spojení s http serverem HTTPResponse – reprezentuje odpověď z http serveru Když máme vytvořenou instanci serveru, můžeme již posílat požadavek na server pomocí metody request(). Jelikož tento modul nabízí značné funkce, doporučuji prostudovat dokumentaci k tomuto modulu. Pro představu je zde příklad, který obsahuje proměnná data na, kterou máme v atributu v metodě HTTPConnection.
-3-
>>> from httplib import HTTPConnection >>> conn = HTTPConnection(’www.seznam.cz’) >>> >>> >>> 200 >>> >>>
conn.request(’GET’, ’/’) r = conn.getresponse() print r.status, r.reason OK data = r.read() conn.close()
-4-
Bibliografie ŠVEC, Jan. Létající cirkus,Python tutoriál [online]. 13.února.2003 [cit. 2009-12-15]. Dostupný z WWW: < http://i.iinfo.cz/r/old/data/letajici_cirkus.pdf>.
-5-
Ověření z kapitoly 6 – Vlákna a internetové protokoly 1. Jaké moduly používáme pro práci s vlákny? a) thread b) threading c) ftplib 2. K čemu slouží protokol SMTP? a) Přenos souborů b) Univerzální protokol c) Elektronická pošta 3. Jak musíme pojmenovat funkci, která se má spouštět pomocí vlákna? a) spust() b) run() c) vlakno()
-6-