Ar švari, lengva alternatyva „Python“ susukta?

A (ilgas), o aš parašiau žiniatinklio vorą, kurį aš tuo pačiu metu leidžiau vienu metu. Tai buvo mano „Python“ jaunystėje, prieš kelias dienas, kai sužinojau apie GIL ir su tuo susijusius klausimus, susijusius su kelių sriegių kodu (IE, dažniausiai baigiama serializacija!) ...

Norėčiau pakeisti šį kodeksą, kad jis taptų patikimesnis ir geriau veiktų. Galiu tai padaryti dviem būdais: galėčiau naudoti naują daugiaprocesų modulį 2.6+ versijoje, arba galėčiau eiti į reaktorių / modelį. Norėčiau tai padaryti vėliau, nes tai yra daug paprastesnė ir mažiau klaidinga.

Taigi kyla klausimas, kokia sistema geriausiai atitinka mano poreikius. Toliau pateikiamas parametrų sąrašas, kurį iki šiol žinau:

  • „Twisted“ : „Python“ sistemos senelis: atrodo sudėtinga ir šiek tiek ištinusi. Stipri mokymosi kreivė mažai užduočiai.
  • Eventlet : Nuo lindenlab vaikinų . Šiems uždaviniams daugiausia dėmesio skirta „Greenlet“ sistemai. Pažvelgiau į kodą, nors tai nėra pernelyg mielas: nesuderinamas su pep8, išsklaidytas pirštų atspaudais (kodėl žmonės tai daro rėmeliuose!?), API atrodo šiek tiek nenuosekli.
  • PyEv : nesubrendęs , niekas, atrodo, šiuo metu jį naudoja, nors jis yra pagrįstas libevent, todėl jis gavo tvirtą pagrindą.
  • asyncore : Nuo stdlib : über žemesnio lygio, atrodo, kad daug darbo yra susijęs tik su kažkuo iš žemės.
  • tornadas : nors jis yra į serverį orientuotas produktas, skirtas dinaminėms serverių svetainėms, jis turi async HTTP klientą ir paprastą ioloop . Atrodo, kad jis galėjo atlikti savo darbą, bet ne tai, ką jis turėjo. [redaguoti: neveikia sistemoje „Windows“, deja, jis apskaičiuojamas man - tai reikalavimas, kad galėčiau palaikyti šią nevykusią platformą]

Ar yra nieko, ką praleidau? Žinoma, turėtų būti biblioteka, kuri atitinka supaprastinto asinchroninio tinklo bibliotekos saldumą!

[redaguoti: Labai ačiū už šį puslapį . Jei einate į apačią, pamatysite, kad yra tikrai geras projektų sąrašas, kuris kažkaip išsprendžia šią problemą. Atrodo, kad iš tikrųjų viskas prasidėjo nuo momento, kai buvo sukurtas „Twisted“: dabar žmonės, atrodo, labiau renkasi bendrą programą , o ne tradicinį reaktorių / atgalinį ryšį. Šio požiūrio privalumai yra aiškesni ir labiau tiesioginiai: aš tikrai buvau anksčiau, ypač dirbdamas su C ++ ++ boost.asio , kad skambučių kodai gali sukelti projektų, kurie gali būti sunkiai pasiekiami, ir palyginti neapibrėžtų mokymų akių. . Vietinių paprogramių naudojimas leidžia jums parašyti kodą, kuris atrodo bent šiek tiek labiau sinchroniškai. Manau, kad dabar mano užduotis yra sukurti, kuri iš šių daug bibliotekų man patinka ir atiduoda! Džiaugiuosi, kad paklausiau dabar ...]

[redaguoti: galbūt įdomus visiems, kurie stebėjo ar suklupo šiam klausimui ar rūpinosi šia tema bet kokiu būdu: aš rasiu tikrai puikų įrašą apie esamus įrankius šiam darbui]

208
01 дек. nustatyti jkp 01 dec. 2009-12-01 09:49 '09 ne 9:49 2009-12-01 09:49
@ 14 atsakymų

Man patiko „Python“ modulio, kuris remiasi „Stackless Python“ mikrofonais arba „Greenlets“, sutapimu, kad būtų lengva pjauti. Visos blokuojančios tinklo I / O operacijos yra skaidriai atliekamos asinchroniniu būdu per vieną libevent ciklą, todėl ji turėtų būti beveik tokia pat veiksminga kaip tikrasis asinchroninis serveris.

Manau, kad taip atrodo kaip renginys.

Trūkumas yra tas, kad jo API labai skiriasi nuo Python sockets / threading modulių; turite perrašyti teisingą paraiškos dalį (arba parašyti suderinamumo sluoksnį)

Redaguoti: Atrodo, kad yra ir panašus kogenas, tačiau jo „Coroutines“ vietoj „Greenlets“ naudoja patobulintus „Python 2.5“ generatorius. Tai daro jį nešiojamą, o ne sutapimą ir kitas alternatyvas. Tinklo I / O yra atliekamas tiesiogiai naudojant epoll / kqueue / iocp.

27
01 дек. atsakymas įdėtas į gruodžio 1 d. 2009-12-01 11:12 '09, 11:12, 2009-12-01 11:12

Twisted yra sudėtingas, jūs teisus apie tai. „Twisted“ nėra ištinęs.

Jei žiūrėsite čia: http://twistedmatrix.com/trac/browser/trunk/twisted , rasite organizuotą, išsamų ir labai išbandytą daugelio interneto protokolų rinkinį, taip pat patvirtinimo kodą labai sudėtingų tinklo programų rašymui ir diegimui. Aš nesupainičiau minties su pilnumu.

border=0

Gerai žinoma, kad Twisted dokumentacija iš pirmo žvilgsnio nėra pats patogiausias vartotojui, ir manau, kad tai padėjo išvengti nelaimingo žmonių skaičiaus. Bet susukti streikai (IMHO), jei įdėjote laiką. Aš tai padariau, ir tai pasirodė esą vertas, ir norėčiau rekomenduoti kitiems išbandyti tą patį.

97
01 дек. Atsakymas suteiktas 01 d. 2009-12-01 12:06 '09, 12:06 2009-12-01 12:06

aiškus įvykis.

API sąsaja atitinka tas pačias konvencijas, kaip ir standartinė biblioteka (ypač srautiniai ir daugiaprocesiniai moduliai), kur ji yra prasminga. Taigi, jūs turite žinomų dalykų, pvz., Eilę ir įvykį, kad dirbtumėte .

Jis palaiko tik „ libevent“ ( atnaujinimas: libev nuo 1.0 versijos ), tačiau visapusiškai jį naudoja, teikdamas greitą „WSGI“ serverį, pagrįstą „libevent-http“ ir leidžiančiu DNS užklausoms per „libevent-dns“, skirtingai nuo siūlų grupės, pvz. kitų bibliotekų. ( atnaujinti :) , nes 1.0 c-ares naudojamas asinchroninių DNS užklausų kūrimui, taip pat galima pasirinkti threadpool parinktį.)

Kaip ir renginys, jis daro nereikalingus atšaukimus ir atidėjimus naudojant „ greenlets“ .

Žr. Pavyzdžius: vienu metu atsisiųsti kelis URL , pokalbius internete .

56
02 дек. Denio Bilenko atsakymas 02.12 2009-12-02 12:15 '09 12:15 am 2009-12-02 12:15

Tiesą sakant, Nicolas Pyel savo dienoraštyje padarė įdomų tokių sistemų palyginimą : verta skaityti!

27
23 дек. atsakymas pateikiamas jkp 23 dec. 2009-12-23 11:14 '09, 11:14, 2009-12-23 11:14

Nė vienas iš šių sprendimų nepadės išvengti to, kad GIL neleidžia naudoti CPU lygiagretumo - tai tiesiog geriausi būdai gauti IO lygiagretumą, kurį jau turite su siūlais. Jei manote, kad galite geriau nei IO, visais būdais vykdykite vieną iš jų, bet jei jūsų kliūtis apdorojant rezultatus nieko čia nepadeda, išskyrus daugiaprocesinį modulį.

15
01 дек. atsakymą pateikė Adam Hupp 01 d. 2009-12-01 19:54 '09 19:54 val. 2009-12-01 19:54

Nenorėčiau eiti tiek, kad galėčiau paskambinti Twisted ištinęs, bet sunku suvynioti. Aš labai ilgai išvengiau tikrai įsitraukus į mokymą, nes „mažoms užduotims“ visuomet šiek tiek lengviau.

Tačiau dabar, kai dirbau su šiuo klausimu, turiu pasakyti, kad visos baterijos yra labai gražios.

Visos kitos asinchroninės bibliotekos, su kuriomis dirbau, tampa mažiau subrendusios, nei atrodo. Važiuojamas įvykių ciklas yra nepertraukiamas.

Nesu visiškai tikras, kaip išspręsti Twisted stačią mokymosi kreivę. Tai gali padėti, jei kas nors jį sugadins ir išvalys kelis dalykus, pavyzdžiui, pašalina visą atgalinį suderinamumą su vėsiais ir mirusiais projektais. Bet manau, kad brandžios programinės įrangos pobūdis.

11
02 дек. atsakymas pateikiamas rhettg 02 dec. 2009-12-02 05:33 '09 at 5:33 am 2009-12-02 05:33

Kamaelia dar nepaminėta. Jo lygiagretumo modelis pagrįstas komponentų deriniu ir pranešimų persiuntimu tarp gaunamų ir išeinančių >Čia pateikiama greita apžvalga.

8
01 дек. Steven Kryskalla atsakymas, pateiktas gruodžio 1 d. 2009-12-01 20:25 '09, 08:25 pm 2009-12-01 20:25

Kai kuriuos dalykus pradėjau naudoti susukti. Jo grožis yra beveik todėl, kad jis yra „ištinęs“. Yra beveik bet kurių pagrindinių protokolų jungtys. Galite turėti jabber'o botą, kuris gaus komandas ir išsiųs pranešimus į irc serverį, siųsti juos kam nors, paleis komandą, skaitys iš NNTP serverio ir stebės tinklalapį, kad galėtumėte atlikti pakeitimus. Bloga naujiena yra ta, kad jis gali tai padaryti ir gali padaryti tai, kad paprastos užduotys, pvz. Python privalumas, nors įtraukiate tik tai, ko jums reikia. Taigi, nors atsisiuntimas gali būti 20 MB, galite įtraukti tik 2 MB bibliotekų (vis dar yra daug jų). Mano didžiausias iškreiptas skundas, nors ir apima pavyzdžius, yra kažkas, išskyrus pagrindinį TCP serverį.

Nors nebuvo jokio „python“ sprendimo, pamačiau, kad node.js įgyja daug daugiau traukos galų. Tiesą sakant, aš apsvarstiau klausimą dėl mažų projektų, bet aš tiesiog išspausdinu, kai išgirdau javascript :)

7
23 июля '10 в 19:37 2010-07-23 19:37 atsakymas pateikiamas vrillusionams liepos 23, 10, 19:37 2010-07-23 19:37

Whizzer yra maža asinchroninė lizdinė infrastruktūra, kurioje naudojama pyev. Tai labai greitai, visų pirma dėl gėrimo. Ji bando pateikti panašią sąsają, susuktą su nedideliais pakeitimais.

4
13 сент. Atsakymas pateikiamas nuo rugsėjo 13 d. 2010-09-13 20:09 '10, 20:09, 2010-09-13 20:09

Yra gera knyga apie temą: „Twisted Network Support pagrindai“, Abe Fettig. Pavyzdžiai rodo, kaip rašyti labai „Pythonic“ kodą, ir man asmeniškai nesutraukite išpūstos struktūros pagrindu. Pažvelkite į knygoje pateiktus sprendimus, jei jie nėra švarūs, tada aš nežinau, kokios yra švarios priemonės.

Mano vienintelis mįslas yra tas pats, kaip ir kitos sistemos, pvz., Ruby. Aš nerimauju, ar jis plečiasi? Nenorėčiau, kad klientas prisijungtų prie infrastruktūros, turinčios mastelio keitimo problemų.

4
26 февр. atsakymą pateikė mrsmoothie 26 vasaris. 2010-02-26 07:30 '10, 7:30, 2010-02-26 07:30

Taip pat pabandykite sinchronizuoti . Jis grindžiamas coroutine (taip panašus į Concurrence, Eventlet ir gevent). Jis įgyvendina ne blokuojančius pakeitimus socket.socket, socket.gethostbyname (ir tt), Ssl.SSLSocket, time.sleep ir select.select. Tai greita. Jis turi beprotį „Python“ ir „libevent“. Jame yra reikalingas Python plėtinys, parašytas C (Pyrex / Cython).

2
19 апр. atsakymas pateikiamas p 2010-04-19 21:56 '10, 21:56, 2010-04-19 21:56

Patvirtinu malonės sinchronizavimą . Jis gali naudoti „libev“ (naujesnę, švaresnę ir geresnę „libevent“ versiją). Keletą kartų jis neturi tiek daug paramos, kaip dabar, bet dabar vystymosi procesas tęsiasi ir yra labai naudingas.

2
16 янв. Atsakymą pateikė Robert Zaremba sausio 16 d 2011-01-16 03:05 '11 at 3:05 2011-01-16 03:05

Jei norite tiesiog supaprastintą, lengvą HTTP užklausos biblioteką, aš manau, kad Unirest tikrai gerai

1
21 янв. atsakymas duotas ejectamenta 21 jan. 2015-01-21 15:55 '15 15:55 2015-01-21 15:55

Galite pažiūrėti „PyWorks“, kuris naudoja visiškai kitokį požiūrį. Tai leidžia objekto egzemplioriams paleisti savo giją ir skambina šios asinchroninio objekto funkcijai.

Tiesiog leiskite klasei paveldėti iš užduoties, o ne objekto, ir tai yra asinchroninis, visi metodo skambučiai yra proksai. Grąžinimo vertės (jei reikia) yra būsimos prokuratūros.

 res = obj.method( args ) # code continues here without waiting for method to finish do_something_else( ) print "Result = %d" % res # Code will block here, if res not calculated yet 

„PyWorks“ galima rasti adresu http://bitbucket.org/raindog/pyworks

0
29 дек. Atsakymą pateikė Renejsum 29 dec. 2013-12-29 01:49 '13 ne 1:49 2013-12-29 01:49

Kiti klausimai apie žymes „ arba Užduoti klausimą