twisted presentation & jamendo usecases

20
Twisted Présentation & Usecases Monday, June 1, 2009

Upload: sylvain-zimmer

Post on 27-Dec-2014

1.651 views

Category:

Technology


5 download

DESCRIPTION

Presentation I gave 30/05/2009 at PyCon FR in Paris http://pycon.frI'm not a twisted guru but I tried to explain to the audience as simply as I could the idea of asynchronous programming and the benefits of Twisted.

TRANSCRIPT

Page 1: Twisted presentation & Jamendo usecases

TwistedPrésentation & Usecases

Monday, June 1, 2009

Page 2: Twisted presentation & Jamendo usecases

Twisted?

• Framework pour applis réseau

• 100% Python, quelques optimisations en C

• Projet opensource stable, bien maintenu

• Programmation asynchrone

Monday, June 1, 2009

Page 3: Twisted presentation & Jamendo usecases

Asynchrone?

• Synonymes : “event-driven”, “non-blocking”

• Toutes les fonctions doivent retourner “rapidement”

• 1 seul thread

• Reactor pattern

Monday, June 1, 2009

Page 4: Twisted presentation & Jamendo usecases

Sync vs. Asyncdef google_sync(search) html = urllib.urlopen(“http://google.com/?q=”+search”).read() return [r[1] for r in re.split(“<h3>(.*?)</h3>”,html)]

print google_sync(“pycon fr”)print google_sync(“pycon us”)

def google_async(search) async_call = twisted.web.client.getPage(“http://google.com/?q=”+search”) async_call.addCallback(gotresults)

def gotresults(html) print [r[1] for r in re.split(“<h3>(.*?)</h3>”,html)]

google_async(“pycon fr”)google_async(“pycon us”)

twisted.internet.reactor.run()

Monday, June 1, 2009

Page 5: Twisted presentation & Jamendo usecases

“C’est plus compliqué!”

• Oui mais

• 100 requêtes en parallèle ?

Monday, June 1, 2009

Page 6: Twisted presentation & Jamendo usecases

“C’est plus compliqué!”

• Oui mais

• 100 requêtes en parallèle ?

results = []

class google_thread(Thread): def __init__(self,search): self.search = search

def run(): html = urllib.urlopen(“http://google.com/?q=”+search”).read() results.append([r[1] for r in re.split(“<h3>(.*?)</h3>”,html)])

threads = [google_thread(“pycon fr”), google_thread(“pycon us”)][thread.start() for thread in threads]print results

Monday, June 1, 2009

Page 7: Twisted presentation & Jamendo usecases

Et là ?

results = []

class google_thread(Thread): def __init__(self,search): self.search = search

def run(): html = urllib.urlopen(“http://google.com/?q=”+search”).read() results.append(“Resultats pour ‘%s’ :” % self.search) results.append([r[1] for r in re.split(“<h3>(.*?)</h3>”,html)])

threads = [google_thread(“pycon fr”), google_thread(“pycon us”)][thread.start() for thread in threads]

Monday, June 1, 2009

Page 8: Twisted presentation & Jamendo usecases

Thread safety

results = []

class google_thread(Thread): def __init__(self,search): self.search = search

def run(): html = urllib.urlopen(“http://google.com/?q=”+search”).read() acquire_lock(results) results.append(“Resultats pour ‘%s’ :” % self.search) results.append([r[1] for r in re.split(“<h3>(.*?)</h3>”,html)]) release_lock(results)

threads = [google_thread(“pycon fr”), google_thread(“pycon us”)][thread.start() for thread in threads]

Monday, June 1, 2009

Page 9: Twisted presentation & Jamendo usecases

Thread safety

• Locks

• Queues

• Semaphores

• ...

Monday, June 1, 2009

Page 10: Twisted presentation & Jamendo usecases

Thread safety

Monday, June 1, 2009

Page 11: Twisted presentation & Jamendo usecases

Version asynchrone

def google_async(search) async_call = twisted.web.client.getPage(“http://google.com/?q=”+search”) async_call.addCallback(gotresults)

def gotresults(html) print [r[1] for r in re.split(“<h3>(.*?)</h3>”)]

google_async(“pycon fr”)google_async(“pycon us”)

twisted.internet.reactor.run()

Monday, June 1, 2009

Page 12: Twisted presentation & Jamendo usecases

Version asynchrone

results = []

def google_async(search) async_call = twisted.web.client.getPage(“http://google.com/?q=”+search”) async_call.addCallback(gotresults,search)

def gotresults(html,search) results.append(“Resultats pour ‘%s’ :” % search) results.append([r[1] for r in re.split(“<h3>(.*?)</h3>”,html)])

google_async(“pycon fr”)google_async(“pycon us”)

twisted.internet.reactor.run()

• 1 seul thread!

Monday, June 1, 2009

Page 13: Twisted presentation & Jamendo usecases

Deferreds

• Promesse d’un resultat futur

• addCallback

• addErrback

• Chains

• DeferredLists

def google_async(search) async_call = twisted.web.client.getPage(“http://google.com/?q=”+search”) async_call.addCallback(gotresults)

Monday, June 1, 2009

Page 14: Twisted presentation & Jamendo usecases

Deferreds

Monday, June 1, 2009

Page 15: Twisted presentation & Jamendo usecases

Reactor

• “Dont call us, we’ll call you”

• Event Loop

• S’occupe d’appeller tous les callbacks

• “Remplace” le GIL, thread switching

• “Pluggable” : select/poll, epoll, GUI, ...

Monday, June 1, 2009

Page 16: Twisted presentation & Jamendo usecases

Autres avantages• Librairie très complète : HTTP, SSH, IRC,

DNS, IMAP, Jabber, SMTP, Telnet, ...

• Ne pas réinventer la roue / patterns

• Déploiement rapide d’applis complexes

• Threadpool

• Encapsulation/design

• Moins de surprises

Monday, June 1, 2009

Page 17: Twisted presentation & Jamendo usecases

Utilisateurs de Twisted

• Apple

• NASA

• Justin.tv

• Bittorrent / Zope / Freevo / Buildbot / ...

• ???

• Jamendo :)

Monday, June 1, 2009

Page 18: Twisted presentation & Jamendo usecases

Twisted chez Jamendo

• Upload servers

• Log servers

• Radio servers

• Widget servers

• Streaming / Download servers

Monday, June 1, 2009

Page 19: Twisted presentation & Jamendo usecases

Download servers• 10k lignes de code

• HTTP “sécurisé”, download queues

• FTP avec virtual filesystem

• Génération de zips à la volée

• Seeds BitTorrent

• Logs UDP / Monitoring

• twisted.manhole

Monday, June 1, 2009

Page 20: Twisted presentation & Jamendo usecases

Sylvain [email protected]

twitter.com/sylvinus

Merci de votre attention!

Monday, June 1, 2009