Lizdų manipuliavimas naudojant „Python“

Turinys
The lizdai Jie yra sąsaja, leidžianti mums bendrauti dviem ar daugiau kompiuterių per tinklą. Dėl to mes galime sukurti įvairių tipų programas, kurios padeda mums perduoti duomenis internetu ir taip pamatyti rezultatus, kurių kitu atveju neturėtume realiu laiku.
Vienas iš labiausiai paplitusių būdų įdiegti lizdus yra protokolas TCPTai padeda, kad palaikant operacinę sistemą perdavimas internetu yra normalus ir be problemų.
Kadangi mes šiek tiek žinome apie pagrindinę lizdų koncepciją, pradėsime manipuliuoti jų savybėmis, viena iš jų yra laukimo laikas.
Palaukite laikoThe laukimo laikas Tai leidžia mums nustatyti, kiek laiko lizdas gali būti dėmesingas duomenims priimti ar siųsti, tai labai svarbu, nes jei programa bus užblokuota, kol šis laikas laukia, galime patirti riziką sulėtinti visą sistemą . Štai kodėl mums reikia žinoti, kas yra iš anksto nustatytas laukimo laikas, taip pat, kad galėtume patys tai nustatyti savo patogumui.
Norėdami tai pasiekti, galime naudoti keletą metodų, kurie tam tikslui yra naudojami standartinėje bibliotekoje lizdas apie Python.
gettimeout ()Pirmasis metodas yra gettimeout () ir kaip rodo jo pavadinimas, jis siūlo mums pradinį lizdo laukimo laiką, kurį perduodame kaip parametrą.
išeitis ()Antrasis metodas yra išeitis () ir jos funkcionalumas yra nustatyti atitinkamo lizdo skirtąjį laiką, išreikštą milisekundėmis.
Dabar mes sukursime nedidelę programą, kuri leis mums įgyvendinti tai, ką išmokome, tam pirmiausia sukursime lizdo tipo objektą, kuris bus mūsų bandomasis objektas, todėl mes perduosime šeimai ir lizdo tipą konstruktoriui ir su tuo galime taikyti metodus.
Norėdami pamatyti pakeitimus, kai tik sukuriame savo lizdą, atspausdinsime jo laukimo laiką, kuris turi būti nulinis, nes tai naujas objektas, tada su metodu išeitis () Nustatysime naują laukimo laiką ir galiausiai atspausdinsime informaciją, taip patvirtindami, kad viskas veikė taip, kaip turėtų.
Kad visa tai pasiektume, turime užtikrinti, kad turime Python įdiegta mūsų sistemoje, jos versijoje 2.7ir turėti teksto redaktorių, kad galėtume kurti failus naudodami programas, nors pratimą taip pat galime atlikti konsolėje, tačiau tai yra šiek tiek nepatogiau ir nėra patvarus, o tai reiškia, kad prarasime darbą. Pažvelkime į šio pavyzdžio šaltinio kodą:
 #! / usr / bin / env python importavimo lizdas def timeout_socket (): s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print "Pradinis laikas yra:% s"% s.gettimeout () s. settimeout (100 ) print "Naujas laikas baigėsi:% s"% s.gettimeout () if __name__ == '__main__': time_out_socket () 

Mes tai išsaugosime naujame faile, pavadintame socketTimeWait.py ir mes jį vykdysime konsolėje, rezultatas turėtų būti panašus į šį:

The buferis Tai dar vienas dalykas, į kurį turime atsižvelgti dirbdami su lizdais, nes šis komponentas parodys duomenų kiekį, kurį šiuo metu galime perduoti daugiau buferio Kuo didesnis duomenų kiekis, tai taip pat reiškia daugiau išteklių sunaudojimo ir ilgesnio laukimo laiko juos perduodant. Priešingu atveju a mažesnis buferis Tai reiškia didesnį greitį, nors ir riboja perduodamų duomenų kiekį, todėl tai yra įgūdis, kurį turime įvaldyti.
setsockopt ()Kad padėtų mums manipuliuoti bibliotekos buferiu lizdas apie Python siūlo mums metodą setsockopt(), kurį turime taikyti lizdo klasės egzemplioriui. Jei norime pakeisti buferio dydį, būtinai pirmiausia turime žinoti pradinį lizdo buferio dydį, tam mes taip pat turime metodą getockopt () ir jis naudojamas panašiai kaip ir aukščiau aprašytas metodas.
Mes ketiname sukurti nedidelę programą, kad parodytume tai, ką paaiškinome anksčiau, kodu, kurį pamatysime pirmiausia sukurti konstantų porą kuriuos naudosime savo programoje ir būsime apibrėžti 4096 Tai yra buferių, kuriuos mes nustatysime, vertė.
Tada mes sukuriame lizdo klasės egzempliorių, kad iškart paprašytume pradinių buferio dydžių, tada atspausdintume juos ekrane.
Galiausiai naudosime metodą setsockopt () Norint nustatyti norimą buferio dydį naudojant konstantas, apibrėžtas programos pradžioje, šis metodas gauna tris parametrus, lygį, pavadinimą ir galiausiai buferio vertę.
Pažiūrėkime kodą, kuris padeda mums paaiškinti, ką paaiškinome, mes jį išsaugosime faile, pavadintame size_buffer.py:
 #! / usr / bin / env python importavimo lizdas TAM_BUFFER_SEND = 4096 TAM_BUFFER_RECEPCION = 4096 def manipulate_buffer (): sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) (socket.SOL_SOCKET, socket.SO_SNDBUF) print "Buferio dydis [iki]:% d"% Buferio dydis sock.setsockopt (socket.SOL_TCP, socket.TCP_NODELAY, 1) sock.setsockopt (socket.SOL_SOCKET, socket.SO_FN setsockopt (socket.SOL_SOCKET, socket.SO_RCVBUF, SIZE_BUFFER_RECEPCION) buffersize = sock.getsockopt (socket.SOL_SOCKET, socket.SO_SNDBUF) print "Buferio dydis [po]:% d"% manipu__ffer_buffer = '__ () 

Kai mes parašysime savo programą, pradėsime ją vykdyti konsolėje ir pamatysime, kad buferio reikšmes gauname prieš ir po jos dydžio pakeitimo.

Kaip ir visų tipų programose, dirbdami su lizdais nesame atleisti nuo klaidų, todėl turime vengti, kad šios klaidos mus nustebina, nes jei taip atsitinka, mūsų programa gali veikti nenuspėjamai.
Štai kodėl mes turime išmokti tvarkyti klaidas, tokiu būdu, jei įvyktų netikėta situacija, mūsų programa nemirtų, bet praneštų mums, kad kažkas atsitiko, taip išvengsime duomenų sugadinimo ar panašių situacijų, turinčių įtakos mūsų programos stabilumui.
Kaip tai tvarkyti?Tai pasiekiame naudodami blokus pabandyk - išskyrus kurios leidžia mums įvertinti situacijas, paprastai susijusias su duomenimis, kurių mes negalime kontroliuoti, ir pagal tai galime veikti pagal scenarijus pagal gautus atsakymus. Jei pateksime į skyrių išskyrus iš bloko galime naudoti mūsų egzemplioriaus klaidos savybę ir kartu su juo atspausdinti tai, kas atsitiko, ir taip sužinoti, kokia buvo klaida.
Šioje programoje mes išbandysime tai, ką apibrėžėme paaiškinimo metu. Visų pirma, mes sukursime bloką, kuris valdys mus, ar sukūrus lizdą įvyko klaida, ar ne, tai galime užtikrinti gerą mūsų kodo pradžią.
Tada mes įvertinsime mūsų programos ryšį su nuotoliniu kompiuteriu per tam tikrą prievadą ir, tvarkydami klaidas, galime apibrėžti pasirinktinį pranešimą. Galiausiai paskambiname į savo funkciją ir su ja atliksime aprašytus veiksmus.
Pažiūrėkime šį kodą, kurį turime išsaugoti faile, pavadintame error_socket.py ir tada paleisime jį konsolėje:
 #! / usr / bin / env python import sys import socket host = 'http: //python.orgt' port = '06' def error_handling (): try: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) Išskyrus socket.error, e: print "Kuriant lizdą:% s" įvyko klaida prisijungimo adresas:% s "% e sys.exit (1), išskyrus socket.error, e: print" Ryšio klaida:% s "% e sys.exit (1), jei __name__ == '__main__': error_handling () 

Čia matome, kad pasinaudojome biblioteka sys norint panaudoti metodą išeiti () ir uždarykite programą, kai įvyksta klaida. Taip pat pažymime, kad priegloba yra neteisinga, todėl galime priversti klaidą ir taip pamatyti pranešimą ekrane. Galiausiai pažymime, kad mes naudojame kintamąjį e, kad užfiksuotume lizdo klaidą, todėl galime gauti tikrą informaciją apie tai, kas įvyko.
PrisimintiČia turime būti ypač atsargūs su įdubimas iš kodo prisimink tai Python Nenaudojant breketų, kabliataškiai taip pat apibrėžia blokų uždarymą, priklauso tik nuo mūsų naudojamų tarpų ar skirtukų, taigi, jei tai padarysime neteisingai, pamatysime sintaksės klaidas.
Labai svarbu, kad perskaitytume dokumentus „Python“ lizdų biblioteka kad galėtumėte rasti daugiau ir geresnių būdų pasinaudoti savo ištekliais.
Baigę šį vadovėlį, supratome, kaip tai padaryti Python turi labai lengvai suprantamus įrankius, kurie suteikia mums prieigą prie pasaulio lizdaiTokiu būdu mes galime pradėti programuoti programas, kurios naudoja tinklus realiuoju laiku apdoroti, pavyzdžiui, gauti informaciją iš kitų tinklo mašinų ar net iš interneto.Ar jums patiko ir padėjo ši pamoka?Galite apdovanoti autorių paspausdami šį mygtuką, kad suteiktumėte jam teigiamą tašką
wave wave wave wave wave