Greenlet Vs. Srautai

Aš esu naujas gevents ir greenlets. Radau gerą dokumentą, kaip dirbti su jais, bet niekas man nepateikė priežasties, kodėl ir kada turėčiau naudoti potions!

  • Kokie jie tikrai geri?
  • Ar galiu juos naudoti proxy serveryje?
  • Kodėl gi ne srautai?

Nesu tikras, kaip jie gali suteikti mums lygiagrečiai, jei jie dažniausiai yra bendradarbiavimo programos.

88
21 марта '13 в 22:49 2013-03-21 22:49 Rsh yra nustatytas kovo 21 d ., 13 val. 10:49 2013-03-21 22:49
@ 3 atsakymai

Žalieji teikia lygiagretumą, bet ne lygiagretumą. sutapimas yra tada, kai kodas gali veikti nepriklausomai nuo kito kodo. Paralelizmas - tuo pačiu metu atliekamas vienalaikis kodas. Lygiagretumas yra ypač naudingas, kai reikia daug darbo vietos naudotojui, o tai paprastai yra sunkus procesorius. lygiagretumas yra naudingas trikčių šalinimui, todėl galite planuoti ir pritaikyti įvairias dalis lygiagrečiai.

„Greenlets“ tikrai spindi tinklo programavime, kur sąveika su vienu lizdu gali atsirasti nepriklausomai nuo sąveikos su kitomis lizdais. Tai klasikinis lygiagretumo pavyzdys. Kadangi kiekvienas žalias veikia savo kontekste, galite toliau naudoti sinchronines API be srautų. Tai gera, nes temos yra labai brangios virtualiosios atminties ir branduolio kaštų požiūriu, taigi lygiagretumas, kurį galite pasiekti su sriegiais, yra daug mažesnis. Be to, GIL dėka „Python“ siūlai yra brangesni ir labiau riboti, nei įprasta. Lygiagretumo alternatyvos paprastai yra „Twisted“, „libevent“, „libuv“, „node.js“ ir kt. Projektai, kuriuose visi jūsų kodai turi tokį patį vykdymo kontekstą ir registruoja įvykių tvarkytojus.

Tai puiki idėja naudoti „žalias“ (su tinkama tinklo parama, pvz., Per „gevent“) rašyti tarpinį serverį, nes užklausos apdorojimas gali būti atliekamas savarankiškai ir turi būti parašytas kaip toks.

Želdynai suteikia sutapimą dėl anksčiau pateiktų priežasčių. lygiagretumas nėra lygiagretumas. Paslėpdami registracijos įvykius ir planavimą jums skambučiams, kurie paprastai blokuoja esamą temą, tokie projektai kaip „gevent“ atskleidžia šį sutapimą, nereikalaudami asinchroninės API pakeitimų ir daug mažesnių jūsų sistemos išlaidų.

139
24 марта '13 в 10:47 2013-03-24 10:47 atsakymą pateikė Matt Joiner kovo 13 d. 13 val. 10:47 2013-03-24 10:47

Priimdami „@Max“ atsakymą ir pridedant tam tikrą reikšmę mastui, galite matyti skirtumą. Tai įvykdžiau keisdamas URL, kad užpildytumėte taip:

 URLS_base = ['www.google.com', 'www.example.com', 'www.python.org', 'www.yahoo.com', 'www.ubc.ca', 'www.wikipedia.org'] URLS = [] for _ in range(10000): for url in URLS_base: URLS.append(url) 

Turėjau atsisakyti versijos su keliais procesoriais, nes jis sumažėjo iki 500; bet su 10 000 iteracijų:

border=0
 Using gevent it took: 3.756914 ----------- Using multi-threading it took: 15.797028 

Taigi galite matyti, kad yra reikšmingas I / O skirtumas, naudojant gevent

17
07 марта '15 в 0:16 2015-03-07 00:16 atsakymas pateikiamas „ TemporalBeing“ kovo 7 d. 15 d. 0:16 2015-03-07 00:16

Labai įdomu analizuoti. Čia pateikiamas kodas, kuriuo galima palyginti žaliųjų ir daugiaprocesorių baseinų našumą, palyginti su daugiasukliais:

 import gevent from gevent import socket as gsock import socket as sock from multiprocessing import Pool from threading import Thread from datetime import datetime class IpGetter(Thread): def __init__(self, domain): Thread.__init__(self) self.domain = domain def run(self): self.ip = sock.gethostbyname(self.domain) if __name__ == "__main__": URLS = ['www.google.com', 'www.example.com', 'www.python.org', 'www.yahoo.com', 'www.ubc.ca', 'www.wikipedia.org'] t1 = datetime.now() jobs = [gevent.spawn(gsock.gethostbyname, url) for url in URLS] gevent.joinall(jobs, timeout=2) t2 = datetime.now() print "Using gevent it took: %s" % (t2-t1).total_seconds() print "-----------" t1 = datetime.now() pool = Pool(len(URLS)) results = pool.map(sock.gethostbyname, URLS) t2 = datetime.now() pool.close() print "Using multiprocessing it took: %s" % (t2-t1).total_seconds() print "-----------" t1 = datetime.now() threads = [] for url in URLS: t = IpGetter(url) t.start() threads.append(t) for t in threads: t.join() t2 = datetime.now() print "Using multi-threading it took: %s" % (t2-t1).total_seconds() 

čia yra rezultatai:

 Using gevent it took: 0.083758 ----------- Using multiprocessing it took: 0.023633 ----------- Using multi-threading it took: 0.008327 

Manau, kad žaliasis teigia, kad GIL nėra įpareigotas, priešingai nei daugiametės bibliotekos. Be to, „Greenlet“ dokumente teigiama, kad jis skirtas tinklo operacijoms. Intensyviam tinklų kūrimui srautų perjungimas yra gražus, ir galite matyti, kad daugiapakopis požiūris yra gana greitas. Be to, jis visada norės naudoti oficialią „python“ biblioteką; Bandžiau įdiegti „greenlet“ ant >

10
13 дек. Atsakymas pateikiamas maks. 13 d. 2014-12-13 02:27 '14, 2:27 2014-12-13 02:27

Kiti klausimai apie žymes „ arba „ Klauskite“