SlideShare a Scribd company logo
1 of 31
Download to read offline
Scaling Django with Gevent

          Mahendra M
          @mahendra
   https://github.com/mahendra
@mahendra
●   Python developer for 6 years
●   FOSS enthusiast/volunteer for 14 years
    ●   Bangalore LUG and Infosys LUG
    ●   FOSS.in and LinuxBangalore/200x
●   Gevent user for 1 year
●   Twisted user for 5 years (before migrating)
    ●   Added twisted support libraries like mustaine
Concurrency models
●   Multi-Process
●   Threads
●   Event driven
●   Coroutines
Process/Thread

request   dispatch()   worker_1()


                                    read(fp)

                                     db_rd()

                                     db_wr()

                                    sock_wr()




                       worker_n()
Process/Thread
●   There are blocking sections in the code
●   Python GIL is an issue in thread based
    concurrency
Event driven

event_1                           hdler_1()   ev()



event_2      block_on_events()    hdler_2()



          Events are posted



event_n                           hdler_n()
Event driven web server

 request                        open(fp)    reg()


 opened                         parse()


                event_loop()   read_sql()   reg()


sql_read                       wri_sql()    reg()


sql_writ                       sock_wr()    reg()

responded                       close()
Two years back
●   Using python twisted for half of our products
●   Using django for the other half
●   Quite a nightmare
Python twisted
●   An event driven library (very scalable)
●   Using epoll or kqueue                 Server 1



                                          Server 2
                             Nginx
             Client
                           (SSL & LB)
                                               .
                                               .
                                               .
                                          Server N

                                              Proc 1 (:8080)

                                              Proc 2 (:8080)

                                              Proc N (:8080)
Gevent
A coroutine-based Python networking library that
uses greenlet to provide a high-level synchronous
API on top of the libevent event loop.
Gevent
A coroutine-based Python networking library that
uses greenlet to provide a high-level synchronous
API on top of the libevent event loop.
Coroutines
●   Python coroutines are almost similar to
    generators.

def abc( seq ):
     lst = list( seq )
     for i in lst:
         value = yield i
         if cmd is not None:
              lst.append( value )
r = abc( [1,2,3] )
r.send( 4 )
Gevent features
●   Fast event-loop based on libevent (epoll,
    kqueue etc.)
●   Lightweight execution units based on greenlets
    (coroutines)
●   Monkey patching support
●   Simple API
●   Fast WSGI server
Greenlets
●   Primitive notion of micro-threads with no implicit
    scheduling
●   Just co-routines or independent pseudo-
    threads
●   Other systems like gevent build micro-threads
    on top of greenlets.
●   Execution happens by switching execution
    among greenlet stacks
●   Greenlet switching is not implicit (switch())
Greenlet execution

Main greenlet                     pause()


                                   abc()


                 Child greenlet   func_1()


                                  pause()


                                  some()     reg()

                                  func_2()
Greenlet code
from greenlet import greenlet


def test1():
   gr2.switch()


def test2():
   gr1.switch()


gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
How does gevent work
●   Creates an implicit event loop inside a
    dedicated greenlet
●   When a function in gevent wants to block, it
    switches to the greenlet of the event loop. This
    will schedule another child greenlet to run
●   The eventloop automatically picks up the
    fastest polling mechanism available in the
    system
●   One event loop runs inside a single OS thread
    (process)
Gevent code
import gevent
from gevent import socket
urls = ['www.google.com', 'www.example.com',
'www.python.org']
jobs = [gevent.spawn(socket.gethostbyname, url) for
url in urls]
gevent.joinall(jobs, timeout=2)
[job.value for job in jobs]


['74.125.79.106', '208.77.188.166', '82.94.164.162']
Gevent apis
●   Greenlet management (spawn, timeout, schedule)
●   Greenlet local data
●   Networking (socket, ssl, dns, select)
●   Synchronization
    ●   Event – notify multiple listeners
    ●   Queue – synchronized producer/consumer queues
    ● Locking – Semaphores
●   Greenlet pools
●   TCP/IP and WSGI servers
Gevent advantages
●   Almost synchronous code. No callbacks and
    deferreds
●   Lightweight greenlets
●   Good concurrency
●   No issues of python GIL
●   No need for in-process locking, since a greenlet
    cannot be pre-empted
Gevent issues
●   A greenlet will run till it blocks or switches
    ●   Be vary of large/infinite loops
●   Monkey patching is required for un-supported
    blocking libraries. Might not work well with
    some libraries
Our django dream
●   We love django
●   I like twisted, but love django more
    ●   Coding complexity
    ●   Lack of developers for hire
    ●   Deployment complexity
●   Gevent saved the day
The Django Problem
●   In a HTTP request cycle, we wanted the
    following operations
    ●   Fetch some metadata for an item being sold
    ●   Purchase the item for the user in the billing system
    ●   Fetch ads to be shown along with the item
    ●   Fetch recommendations based on this item
●   In parallel … !!
    ●   Twisted was the only option
Twisted code
def handle_purchase( rqst ):
   defs = []
   defs.append( biller() )
   defs.append( ads() )
   defs.append( recos() )
   defs.append( meta() )
   def = DeferredList( defs, … )
   def.addCallback( send_response() )
   return NOT_DONE_YET
Twisted issues
●   The issues were with everything else
    ●   Header management
    ●   Templates for response
    ●   ORM support
    ●   SOAP, REST, Hessian/Burlap support
        –   We liked to use suds, requests, mustaine etc.
    ●   Session management and auth
    ●   Caching support
●   The above are django's strength
    ●   Django's vibrant eco-system (celery, south,
        tastypie)
gunicorn
●   A python WSGI HTTP server
●   Supports running code under worker, eventlet,
    gevent etc.
    ●   Uses monkey patching
●   Excellent django support
    ●   gunicorn_django app.settings
●   Enabled gevent support for our app by default
    without any code changes
●   Spawns and manages worker processes and
    distributes load amongst them
Migrating our products
def handle_purchase( request ):
    jobs = []
    jobs.append( gevent.spawn( biller, … ) )
    jobs.append( gevent.spawn( ads, … ) )
    jobs.append( gevent.spawn( meta, … ) )
    jobs.append( gevent.spawn( reco, … ) )
    gevent.joinall()
Migrating our products
●   Migrating our entire code base (2 products)
    took around 1 week to finish
●   Was easier because we were already using
    inlineCallbacks() decorator of twisted
●   Only small parts of our code had to be migrated
Deployment

                        Gunicorn 1



                        Gunicorn 2
             Nginx
Client
           (SSL & LB)
                             .
                             .
                             .
                        Gunicorn N

                                 Proc 1

                                 Proc 2

                                 Proc N
Life today
●   Single framework for all 4 products
●   Use django's awesome features and
    ecosystem
●   Increased scalability. More so with celery.
●   Use blocking python libraries without worrying
    too much
●   No more usage of python-twisted
●   Coding, testing and maintenance is much
    easier
●   We are hiring!!
Links
●   http://greenlet.readthedocs.org/en/latest/index.html
●   http://www.gevent.org/
●   http://in.pycon.org/2010/talks/48-twisted-programming

More Related Content

What's hot

Real time analytics with Netty, Storm, Kafka
Real time analytics with Netty, Storm, KafkaReal time analytics with Netty, Storm, Kafka
Real time analytics with Netty, Storm, Kafka
Trieu Nguyen
 

What's hot (20)

Denys Serhiienko "ASGI in depth"
Denys Serhiienko "ASGI in depth"Denys Serhiienko "ASGI in depth"
Denys Serhiienko "ASGI in depth"
 
Back to [Jaspersoft] Basics: Rest API 101
Back to [Jaspersoft] Basics: Rest API 101Back to [Jaspersoft] Basics: Rest API 101
Back to [Jaspersoft] Basics: Rest API 101
 
Understanding greenlet
Understanding greenletUnderstanding greenlet
Understanding greenlet
 
Why Task Queues - ComoRichWeb
Why Task Queues - ComoRichWebWhy Task Queues - ComoRichWeb
Why Task Queues - ComoRichWeb
 
Unique ID generation in distributed systems
Unique ID generation in distributed systemsUnique ID generation in distributed systems
Unique ID generation in distributed systems
 
Postgres index types
Postgres index typesPostgres index types
Postgres index types
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Hive Data Modeling and Query Optimization
Hive Data Modeling and Query OptimizationHive Data Modeling and Query Optimization
Hive Data Modeling and Query Optimization
 
Apache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native EraApache Flink in the Cloud-Native Era
Apache Flink in the Cloud-Native Era
 
Introduction to React Hooks
Introduction to React HooksIntroduction to React Hooks
Introduction to React Hooks
 
Real time analytics with Netty, Storm, Kafka
Real time analytics with Netty, Storm, KafkaReal time analytics with Netty, Storm, Kafka
Real time analytics with Netty, Storm, Kafka
 
Big Data Security in Apache Projects by Gidon Gershinsky
Big Data Security in Apache Projects by Gidon GershinskyBig Data Security in Apache Projects by Gidon Gershinsky
Big Data Security in Apache Projects by Gidon Gershinsky
 
JavaScript Fetch API
JavaScript Fetch APIJavaScript Fetch API
JavaScript Fetch API
 
Apache Spark At Apple with Sam Maclennan and Vishwanath Lakkundi
Apache Spark At Apple with Sam Maclennan and Vishwanath LakkundiApache Spark At Apple with Sam Maclennan and Vishwanath Lakkundi
Apache Spark At Apple with Sam Maclennan and Vishwanath Lakkundi
 
Basics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdfBasics of React Hooks.pptx.pdf
Basics of React Hooks.pptx.pdf
 
The Hidden Life of Spark Jobs
The Hidden Life of Spark JobsThe Hidden Life of Spark Jobs
The Hidden Life of Spark Jobs
 
Koha Integration: RFID and SIP2
Koha Integration: RFID and SIP2Koha Integration: RFID and SIP2
Koha Integration: RFID and SIP2
 
Redis for duplicate detection on real time stream
Redis for duplicate detection on real time streamRedis for duplicate detection on real time stream
Redis for duplicate detection on real time stream
 
Redis and its Scaling and Obersvability
Redis and its Scaling and ObersvabilityRedis and its Scaling and Obersvability
Redis and its Scaling and Obersvability
 
A Practical Introduction to Handling Log Data in ClickHouse, by Robert Hodges...
A Practical Introduction to Handling Log Data in ClickHouse, by Robert Hodges...A Practical Introduction to Handling Log Data in ClickHouse, by Robert Hodges...
A Practical Introduction to Handling Log Data in ClickHouse, by Robert Hodges...
 

Viewers also liked

Viewers also liked (12)

Python Performance: Single-threaded, multi-threaded, and Gevent
Python Performance: Single-threaded, multi-threaded, and GeventPython Performance: Single-threaded, multi-threaded, and Gevent
Python Performance: Single-threaded, multi-threaded, and Gevent
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с gevent
 
The future of async i/o in Python
The future of async i/o in PythonThe future of async i/o in Python
The future of async i/o in Python
 
Python, do you even async?
Python, do you even async?Python, do you even async?
Python, do you even async?
 
Python Async IO Horizon
Python Async IO HorizonPython Async IO Horizon
Python Async IO Horizon
 
Djangoのエントリポイントとアプリケーションの仕組み
Djangoのエントリポイントとアプリケーションの仕組みDjangoのエントリポイントとアプリケーションの仕組み
Djangoのエントリポイントとアプリケーションの仕組み
 
Scaling Django
Scaling DjangoScaling Django
Scaling Django
 
Web backends development using Python
Web backends development using PythonWeb backends development using Python
Web backends development using Python
 
Python Advanced – Building on the foundation
Python Advanced – Building on the foundationPython Advanced – Building on the foundation
Python Advanced – Building on the foundation
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
WSGI, Django, Gunicorn
WSGI, Django, GunicornWSGI, Django, Gunicorn
WSGI, Django, Gunicorn
 
Python Performance Profiling: The Guts And The Glory
Python Performance Profiling: The Guts And The GloryPython Performance Profiling: The Guts And The Glory
Python Performance Profiling: The Guts And The Glory
 

Similar to Scaling Django with gevent

Similar to Scaling Django with gevent (20)

Scaling django
Scaling djangoScaling django
Scaling django
 
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
 
Helidon Nima - Loom based microserfice framework.pptx
Helidon Nima - Loom based microserfice framework.pptxHelidon Nima - Loom based microserfice framework.pptx
Helidon Nima - Loom based microserfice framework.pptx
 
Improving Operations Efficiency with Puppet
Improving Operations Efficiency with PuppetImproving Operations Efficiency with Puppet
Improving Operations Efficiency with Puppet
 
My "Perfect" Toolchain Setup for Grails Projects
My "Perfect" Toolchain Setup for Grails ProjectsMy "Perfect" Toolchain Setup for Grails Projects
My "Perfect" Toolchain Setup for Grails Projects
 
[KubeCon EU 2020] containerd Deep Dive
[KubeCon EU 2020] containerd Deep Dive[KubeCon EU 2020] containerd Deep Dive
[KubeCon EU 2020] containerd Deep Dive
 
Python twisted
Python twistedPython twisted
Python twisted
 
Meiga Guadec 2009 English
Meiga Guadec 2009 EnglishMeiga Guadec 2009 English
Meiga Guadec 2009 English
 
Testing Django APIs
Testing Django APIsTesting Django APIs
Testing Django APIs
 
Distributed Tracing
Distributed TracingDistributed Tracing
Distributed Tracing
 
Distributed tracing 101
Distributed tracing 101Distributed tracing 101
Distributed tracing 101
 
Node.js Presentation
Node.js PresentationNode.js Presentation
Node.js Presentation
 
Netty training
Netty trainingNetty training
Netty training
 
Netty training
Netty trainingNetty training
Netty training
 
A Python Petting Zoo
A Python Petting ZooA Python Petting Zoo
A Python Petting Zoo
 
SWT Tech Sharing: Node.js + Redis
SWT Tech Sharing: Node.js + RedisSWT Tech Sharing: Node.js + Redis
SWT Tech Sharing: Node.js + Redis
 
Customize and Secure the Runtime and Dependencies of Your Procedural Language...
Customize and Secure the Runtime and Dependencies of Your Procedural Language...Customize and Secure the Runtime and Dependencies of Your Procedural Language...
Customize and Secure the Runtime and Dependencies of Your Procedural Language...
 
GQuery a jQuery clone for Gwt, RivieraDev 2011
GQuery a jQuery clone for Gwt, RivieraDev 2011GQuery a jQuery clone for Gwt, RivieraDev 2011
GQuery a jQuery clone for Gwt, RivieraDev 2011
 
Apache Kafka 101 by Confluent Developer Friendly
Apache Kafka 101 by Confluent Developer FriendlyApache Kafka 101 by Confluent Developer Friendly
Apache Kafka 101 by Confluent Developer Friendly
 
Monkey Server
Monkey ServerMonkey Server
Monkey Server
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Scaling Django with gevent

  • 1. Scaling Django with Gevent Mahendra M @mahendra https://github.com/mahendra
  • 2. @mahendra ● Python developer for 6 years ● FOSS enthusiast/volunteer for 14 years ● Bangalore LUG and Infosys LUG ● FOSS.in and LinuxBangalore/200x ● Gevent user for 1 year ● Twisted user for 5 years (before migrating) ● Added twisted support libraries like mustaine
  • 3. Concurrency models ● Multi-Process ● Threads ● Event driven ● Coroutines
  • 4. Process/Thread request dispatch() worker_1() read(fp) db_rd() db_wr() sock_wr() worker_n()
  • 5. Process/Thread ● There are blocking sections in the code ● Python GIL is an issue in thread based concurrency
  • 6. Event driven event_1 hdler_1() ev() event_2 block_on_events() hdler_2() Events are posted event_n hdler_n()
  • 7. Event driven web server request open(fp) reg() opened parse() event_loop() read_sql() reg() sql_read wri_sql() reg() sql_writ sock_wr() reg() responded close()
  • 8. Two years back ● Using python twisted for half of our products ● Using django for the other half ● Quite a nightmare
  • 9. Python twisted ● An event driven library (very scalable) ● Using epoll or kqueue Server 1 Server 2 Nginx Client (SSL & LB) . . . Server N Proc 1 (:8080) Proc 2 (:8080) Proc N (:8080)
  • 10. Gevent A coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libevent event loop.
  • 11. Gevent A coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libevent event loop.
  • 12. Coroutines ● Python coroutines are almost similar to generators. def abc( seq ): lst = list( seq ) for i in lst: value = yield i if cmd is not None: lst.append( value ) r = abc( [1,2,3] ) r.send( 4 )
  • 13. Gevent features ● Fast event-loop based on libevent (epoll, kqueue etc.) ● Lightweight execution units based on greenlets (coroutines) ● Monkey patching support ● Simple API ● Fast WSGI server
  • 14. Greenlets ● Primitive notion of micro-threads with no implicit scheduling ● Just co-routines or independent pseudo- threads ● Other systems like gevent build micro-threads on top of greenlets. ● Execution happens by switching execution among greenlet stacks ● Greenlet switching is not implicit (switch())
  • 15. Greenlet execution Main greenlet pause() abc() Child greenlet func_1() pause() some() reg() func_2()
  • 16. Greenlet code from greenlet import greenlet def test1(): gr2.switch() def test2(): gr1.switch() gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()
  • 17. How does gevent work ● Creates an implicit event loop inside a dedicated greenlet ● When a function in gevent wants to block, it switches to the greenlet of the event loop. This will schedule another child greenlet to run ● The eventloop automatically picks up the fastest polling mechanism available in the system ● One event loop runs inside a single OS thread (process)
  • 18. Gevent code import gevent from gevent import socket urls = ['www.google.com', 'www.example.com', 'www.python.org'] jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls] gevent.joinall(jobs, timeout=2) [job.value for job in jobs] ['74.125.79.106', '208.77.188.166', '82.94.164.162']
  • 19. Gevent apis ● Greenlet management (spawn, timeout, schedule) ● Greenlet local data ● Networking (socket, ssl, dns, select) ● Synchronization ● Event – notify multiple listeners ● Queue – synchronized producer/consumer queues ● Locking – Semaphores ● Greenlet pools ● TCP/IP and WSGI servers
  • 20. Gevent advantages ● Almost synchronous code. No callbacks and deferreds ● Lightweight greenlets ● Good concurrency ● No issues of python GIL ● No need for in-process locking, since a greenlet cannot be pre-empted
  • 21. Gevent issues ● A greenlet will run till it blocks or switches ● Be vary of large/infinite loops ● Monkey patching is required for un-supported blocking libraries. Might not work well with some libraries
  • 22. Our django dream ● We love django ● I like twisted, but love django more ● Coding complexity ● Lack of developers for hire ● Deployment complexity ● Gevent saved the day
  • 23. The Django Problem ● In a HTTP request cycle, we wanted the following operations ● Fetch some metadata for an item being sold ● Purchase the item for the user in the billing system ● Fetch ads to be shown along with the item ● Fetch recommendations based on this item ● In parallel … !! ● Twisted was the only option
  • 24. Twisted code def handle_purchase( rqst ): defs = [] defs.append( biller() ) defs.append( ads() ) defs.append( recos() ) defs.append( meta() ) def = DeferredList( defs, … ) def.addCallback( send_response() ) return NOT_DONE_YET
  • 25. Twisted issues ● The issues were with everything else ● Header management ● Templates for response ● ORM support ● SOAP, REST, Hessian/Burlap support – We liked to use suds, requests, mustaine etc. ● Session management and auth ● Caching support ● The above are django's strength ● Django's vibrant eco-system (celery, south, tastypie)
  • 26. gunicorn ● A python WSGI HTTP server ● Supports running code under worker, eventlet, gevent etc. ● Uses monkey patching ● Excellent django support ● gunicorn_django app.settings ● Enabled gevent support for our app by default without any code changes ● Spawns and manages worker processes and distributes load amongst them
  • 27. Migrating our products def handle_purchase( request ): jobs = [] jobs.append( gevent.spawn( biller, … ) ) jobs.append( gevent.spawn( ads, … ) ) jobs.append( gevent.spawn( meta, … ) ) jobs.append( gevent.spawn( reco, … ) ) gevent.joinall()
  • 28. Migrating our products ● Migrating our entire code base (2 products) took around 1 week to finish ● Was easier because we were already using inlineCallbacks() decorator of twisted ● Only small parts of our code had to be migrated
  • 29. Deployment Gunicorn 1 Gunicorn 2 Nginx Client (SSL & LB) . . . Gunicorn N Proc 1 Proc 2 Proc N
  • 30. Life today ● Single framework for all 4 products ● Use django's awesome features and ecosystem ● Increased scalability. More so with celery. ● Use blocking python libraries without worrying too much ● No more usage of python-twisted ● Coding, testing and maintenance is much easier ● We are hiring!!
  • 31. Links ● http://greenlet.readthedocs.org/en/latest/index.html ● http://www.gevent.org/ ● http://in.pycon.org/2010/talks/48-twisted-programming