SlideShare a Scribd company logo
Async 
Programming and 
Python 
PyCon India, 2014 
Chetan Giridhar
Basics 
• Programming tasks: 
o I/O bound 
o CPU bound 
• Say, you’re doing I/O 
o Will it complete immediately? When will it be done? 
o Wont they block you?
Blocking I/O: Example 
import requests 
r = requests.get(‘http://google.co.in’) 
r.status_code 
• What if the request takes a long time? 
• Operation blocks until all the data is recieved from the server 
Can we do something in the meanwhile? 
Can we run another task, concurrently?
Non Blocking / Async 
• Non-blocking means the ability to make continuous 
progress at all times 
• Resources needed for a response must not be 
monopolized 
• As such it can enable both lower latency, higher 
throughput
Programming Models 
Synchronous model 
time 
time 
time 
Threaded model 
Asynchronous model 
Task 1 Task 2 Task 3
Math 
• Task = make a call to http://ip.jsontest.com 
• Say, Task = Task1 = Task2 = Task 3 = 400ms 
• Sync Model 
o Time taken = Task1+ Task2 + Task3 = 1.2 sec 
• Threaded Model 
o Time taken = 510 ms 
• Async Model 
o Time taken = 460 ms 
What’s the 
magic here?
Async Paradigm 
• Clients requests the event driven web server; 
• requests are processed by event loop; 
• event handlers cater to events with callbacks 
Client Event driven server I/O loop 
Event driven I/O loop 
Request 
IO loop handles 
request 
Event Handlers
Reactor Pattern 
• Typical non blocking frameworks work on a 
philosophy of single threaded event loop 
o keeps polling for events 
Reactor 
Pattern 
Waiting for Events 
Handling Events
More Details! 
• Framework typically maintains a list of file 
descriptors(fd), events to monitor and 
corresponding event handlers for each of the fd 
• Listening to events on a fd is a kernel space task 
o epoll, [kqueue/select] – libraries provide event notifications in a non-blocking 
way 
• Epoll watches file descriptors (sockets) and returns 
needed (READ, WRITE & ERROR) events
Async way 
• Async strategy aims for: 
o Making I/O tasks non blocking 
o I/O tasks would run independently 
o generate an event when tasks are complete 
o with help of callbacks 
• Benefits 
o No need to wait till blocking I/O tasks are complete 
o More responsive real time applications 
o Thread safety isn't an issue 
• Can we solve any other Python problems with this 
mechanism? 
o Eliminating GIL?
Async in Python 
• Frameworks 
o Tornado 
o Twisted 
o Gevent 
• Modules 
o Tulip 
o Asyncio
Async in Python 
• Frameworks 
o Tornado 
o Twisted 
o Gevent 
• Modules 
o Tulip 
o Asyncio
Asyncio 
• Part of Python library 
o The latest module for async application development 
• Only for Python > 3.4 
o Incompatible with prior versions 
• A whole new way to development 
o Let’s you write self contained, synchronous looking tasks 
o Run two infinite loops at the same time on the same thread 
• Works with other framework 
o Tornado, Twisted, GEvent
Asyncio… 
• Write single threaded concurrent code 
• Principle of Interleaved execution of subroutines 
• Co-operative scheduling 
o Only one task at a time 
• Based on libevent 
o Select, kpoll, kqueue
Asyncio: Components 
Event loop 
Co-routines, Futures, Tasks 
Transports, Protocols
Asyncio: Components 
• Event loop 
o Register, executing and cancelling calls 
o Schedule execution of a task (co-routine) 
o Creates transport (async client and server) 
o Runs I/O callbacks (Watches file descriptors) 
o Thread interface 
o [BaseEventLoop.create_task()] or async() 
o [asyncio.get_event_loop()]
Asyncio: Components 
• Co-routine 
o Generator (“yield from”) 
o suspended at preset execution points, and 
o resumed later by keeping track of local state 
o @coroutine decorator
Asyncio: Components 
• Task 
o responsible for executing a coroutine 
o If coroutine yields from a future, the task suspends the execution of the 
coroutine and waits for the future 
o coroutine restarts when future is done 
o Subclass of class Future 
o [async(coroutine)] 
o BaseEventLoop.create_task(coro)
Asyncio: Components 
• Future 
o A class 
o for results that are 
available later 
import asyncio 
@asyncio.coroutine 
def slow_operation(future): 
yield from asyncio.sleep(1) <- Co-routine suspend 
future.set_result('Future is done!') 
def got_result(future): 
print(future.result()) 
loop.stop() 
loop = asyncio.get_event_loop() <- Event loop 
future = asyncio.Future() <- Future object 
asyncio.async(slow_operation(future)) <- Task 
future.add_done_callback(got_result) 
try: 
loop.run_forever() 
finally: 
loop.close()
Asyncio: Components 
• transport 
o represent connections such as sockets, SSL connection and pipes 
o Async socket operations 
• Usually frameworks implement e.g. Tornado 
• protocols 
o represent applications such as HTTP client/server, SMTP, and FTP 
o Async http operation 
o [loop.create_connection()]
Example: Asyncio Redis 
import asyncio 
import asyncio_redis 
@asyncio.coroutine 
def my_subscriber(channels): 
connection = yield from asyncio_redis.Connection.create(host='localhost', port=6379) 
subscriber = yield from connection.start_subscribe() 
yield from subscriber.subscribe(channels) 
while True: 
reply = yield from subscriber.next_published() 
print('Received: ', repr(reply.value), 'on channel', reply.channel) 
loop = asyncio.get_event_loop() 
asyncio.async(my_subscriber('channel-1')) 
asyncio.async(my_subscriber('channel-2')) 
loop.run_forever()
Example: Asyncio ‘Tasks’ 
import asyncio 
@asyncio.coroutine 
def factorial(name, number): 
f = 1 
for i in range(2, number+1): 
print("Task %s: Compute factorial(%s)..." % (name, i)) 
yield from asyncio.sleep(1) 
f *= i 
print("Task %s: factorial(%s) = %s" % (name, number, f)) 
loop = asyncio.get_event_loop() 
tasks = [ 
asyncio.async(factorial("A", 2)), 
asyncio.async(factorial("B", 3)), 
asyncio.async(factorial("C", 4))] 
loop.run_until_complete(asyncio.wait(tasks)) 
loop.close()
Async in Python 
• Frameworks 
o Tornado 
o Twisted 
o Gevent 
• Modules 
o Tulip 
o Asyncio
Tornado Async 
• Event Loop => tornado.ioloop 
• Coroutine => tornado.gen.coroutine 
• Future => tornado.concurrent.future 
• Transport/Protocol => tornado.iostream 
• Bridge the gap => tornado.platform.asyncio – 
Combines asyncio and tornado in same event loop
Tornado Async Http 
import tornado.ioloop 
from tornado.httpclient import AsyncHTTPClient 
def handle_request(response): 
'''callback needed when a response arrive''' 
if response.error: 
print("Error:", response.error) 
else: 
print(’Success') 
print(response.body) 
Before Event Loop Starts! 
Success 
b'{"ip": "117.192.252.80"}n' 
Callback 
http_client = AsyncHTTPClient() # initialize http client 
http_client.fetch(” http://ip.jsontest.com/", handle_request) 
print("Before Event Loop Starts!") 
tornado.ioloop.IOLoop.instance().start() # start the tornado ioloop
Tornado Coroutine 
import tornado.web 
import tornado.gen 
from tornado.httpclient import AsyncHTTPClient 
class GenAsyncHandler(tornado.web.RequestHandler): 
@tornado.gen.coroutine 
def get(self): 
http_client = AsyncHTTPClient() 
response = yield http_client.fetch("http://google.com") 
print(response) 
application = tornado.web.Application([ (r"/", 
GenAsyncHandler), ]) 
if __name__ == "__main__": 
application.listen(8888) 
tornado.ioloop.IOLoop.instance().start() 
gen.coroutine schedules the generator 
to be resumed when the Future is 
resolved 
‘yield’ makes the function a generator 
The generator in turn returns a Future 
instance 
In this case, response, will resolve with 
response from fetch or an exception
Tornado Engine 
class MainHandlerAsync(tornado.web.RequestHandler): 
@tornado.web.asynchronous 
@tornado.gen.engine 
def get(self): 
req = tornado.httpclient.HTTPRequest("http://127.0.0.1:8888/",) 
client = tornado.httpclient.AsyncHTTPClient() 
response = yield tornado.gen.Task(client.fetch, req) 
self.finish() 
application = tornado.web.Application([ 
(r"/async", MainHandlerAsync), 
]) 
if __name__ == "__main__": 
http_server = tornado.httpserver.HTTPServer(application) 
http_server.listen(8888) 
tornado.ioloop.IOLoop.instance().start()
Let’s create our Future! 
myfuture.py server.py 
import time 
import datetime 
from tornado.concurrent import return_future 
class AsyncHTTPClient(object): 
@return_future 
def fetch(self, url, callback=None): 
print("In my fetch") 
time.sleep(0.02) 
result = str(datetime.datetime.utcnow()) 
callback(result) 
import tornado.web 
import tornado.gen 
from myfuture import AsyncHTTPClient 
def test(arg): 
print('In test:' + arg) 
class GenAsync(tornado.web.RequestHandler): 
@tornado.gen.coroutine 
def get(self): 
http_client = AsyncHTTPClient() 
r = yield http_client.fetch(“http://google.com”,test) 
print(r) 
application = tornado.web.Application([ 
(r"/", GenAsync),]) 
if __name__ == "__main__": 
application.listen(8888) 
tornado.ioloop.IOLoop.instance().start()
Performance: 
Blocking vs Async
Work to be achieved
Performance Results 
ab -n 500 -c 10 http://localhost:8888/blocking 
ab -n 500 -c 10 http://localhost:8888/async 
6000 
5000 
4000 
3000 
2000 
1000 
0 
Time per request 
Async Blocking 
Async 
Blocking 
200 
150 
100 
50 
0 
Requests per second 
Async Blocking 
Async 
Blocking
Learnings 
• Async programming is an efficient, easy to 
understand design and code 
• Python asyncio module is comprehensive 
• Has generic use cases for vast variety of 
applications 
o Responsive web applications 
o Networking applications 
• Requires a new way to program and design
Recommendations 
• Async programming is not a holistic solution 
• It has its own pros and cons 
o Suitable for primarily I/O bound applications 
o Needs enough tasks available to run 
• asyncio module is only available for Python 3 
applications 
• Also explore other methods of concurrency: 
o Eventlets 
o STM 
o Multiprocessing/threads 
o Special languages e.g. GO, Scala 
• Understand and use 
References 
• asyncio – http://python.org 
• Python asyncio – 
o http://www.buzzcapture.com 
o www.slideshare.net/saghul 
• Tornado – http://tornadoweb.org 
• Multithreading – www.drdobbs.com 
• Event loop: https://docs.python.org/3/library/asyncio-eventloop. 
html
Contact Us 
• Chetan Giridhar 
o www.technobeans.com 
o https://github.com/cjgiridhar 
• Vishal Kanaujia 
o www.freethreads.wordpress.com 
o https://github.com/vishalkanaujia
Backup
Asyncio: example 
import asyncio 
@asyncio.coroutine 
def create(): 
yield from asyncio.sleep(3.0) 
print("(1) create file") 
@asyncio.coroutine 
def write(): 
yield from asyncio.sleep(1.0) 
print("(2) write into file") 
@asyncio.coroutine 
def close(): 
print("(3) close file") 
@asyncio.coroutine 
def test(): 
asyncio.async(create()) 
asyncio.async(write()) 
asyncio.async(close()) 
yield from asyncio.sleep(2.0) 
loop.stop() 
loop = asyncio.get_event_loop() 
asyncio.async(test()) 
loop.run_forever() 
print("Pending tasks at exit: %s" % asyncio.Task.all_tasks(loop)) 
loop.close()
Python Async Modules 
• Asynccore 
• Asyncchat 
• Gevent 
• Twisted 
• Eventlets
Concurrency Techniques 
• Multithreading/processing 
• Green Threads 
• STM
Tornado + AsyncIO 
from tornado.platform.asyncio import AsyncIOMainLoop 
from tornado.httpclient import AsyncHTTPClient 
import asyncio 
AsyncIOMainLoop().install() -- # Tell Tornado to use the asyncio eventloop 
loop = asyncio.get_event_loop() -- # get the loop 
http_client = AsyncHTTPClient() -- # the Tornado HTTP client 
def aio_fetch(client, url, **kwargs): 
fut = asyncio.Future() 
client.fetch(url, callback=fut.set_result, **kwargs) 
return fut 
@asyncio.coroutine 
def main(): 
print("fetching my site") 
mysite = yield from aio_fetch(http_client, "http://google.com/") 
print("hello httpbin") 
httpbin = yield from aio_fetch(http_client, "http://httpbin.org?q=%d" % mysite.code) 
print(httpbin.body) 
loop.run_until_complete(main())
Co-routine v/s Callback 
import asyncio 
def just_print_messages(loop): 
print('Just print') 
loop.call_later(1, just_print_messages, loop) 
def main(): 
loop = asyncio.get_event_loop() 
try: 
loop.call_soon(just_print_messages, loop) 
loop.run_forever() 
finally: 
loop.close() 
if __name__ == '__main__': 
main() 
import asyncio 
@asyncio.coroutine 
def just_print_messages(): 
while True: 
print('Just print') 
yield from asyncio.sleep(1) 
def main(): 
loop = asyncio.get_event_loop() 
try: 
loop.run_until_complete(just_print_messages()) 
finally: 
loop.close() 
if __name__ == '__main__': 
main()
Async in NodeJS 
request is an 
var http = require(‘http’); 
event 
var server = http.createServer; 
server.on(‘request’, function(request,response) { 
response.writeHead(200); 
response.end(‘Hello World’); 
}).listen(8001); 
Callback 
console.log(‘Server running on port 8001’);

More Related Content

What's hot (20)

Clean code
Clean codeClean code
Clean code
Mahmoud Zizo
 
Operator Overloading in C++
Operator Overloading in C++Operator Overloading in C++
Operator Overloading in C++
Mohammed Sikander
 
C++20 Coroutine
C++20 CoroutineC++20 Coroutine
C++20 Coroutine
진화 손
 
Functions in c++
Functions in c++Functions in c++
Functions in c++
Rokonuzzaman Rony
 
Modules and packages in python
Modules and packages in pythonModules and packages in python
Modules and packages in python
TMARAGATHAM
 
F strings
F stringsF strings
F strings
Mariatta Wijaya
 
Operator overloading C++
Operator overloading C++Operator overloading C++
Operator overloading C++
Lahiru Dilshan
 
Golang - Overview of Go (golang) Language
Golang - Overview of Go (golang) LanguageGolang - Overview of Go (golang) Language
Golang - Overview of Go (golang) Language
Aniruddha Chakrabarti
 
The Rust Programming Language: an Overview
The Rust Programming Language: an OverviewThe Rust Programming Language: an Overview
The Rust Programming Language: an Overview
Roberto Casadei
 
Iterarators and generators in python
Iterarators and generators in pythonIterarators and generators in python
Iterarators and generators in python
Sarfaraz Ghanta
 
This pointer
This pointerThis pointer
This pointer
Kamal Acharya
 
JavaScript Promises
JavaScript PromisesJavaScript Promises
JavaScript Promises
L&T Technology Services Limited
 
Async/Await
Async/AwaitAsync/Await
Async/Await
Jeff Hart
 
Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)
Paige Bailey
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to Python
Nowell Strite
 
Python-Polymorphism.pptx
Python-Polymorphism.pptxPython-Polymorphism.pptx
Python-Polymorphism.pptx
Karudaiyar Ganapathy
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
NAVER / MusicPlatform
 
1.python interpreter and interactive mode
1.python interpreter and interactive mode1.python interpreter and interactive mode
1.python interpreter and interactive mode
ManjuA8
 
C Basics
C BasicsC Basics
C Basics
Sunil OS
 
Templates in C++
Templates in C++Templates in C++
Templates in C++
Tech_MX
 
C++20 Coroutine
C++20 CoroutineC++20 Coroutine
C++20 Coroutine
진화 손
 
Modules and packages in python
Modules and packages in pythonModules and packages in python
Modules and packages in python
TMARAGATHAM
 
Operator overloading C++
Operator overloading C++Operator overloading C++
Operator overloading C++
Lahiru Dilshan
 
Golang - Overview of Go (golang) Language
Golang - Overview of Go (golang) LanguageGolang - Overview of Go (golang) Language
Golang - Overview of Go (golang) Language
Aniruddha Chakrabarti
 
The Rust Programming Language: an Overview
The Rust Programming Language: an OverviewThe Rust Programming Language: an Overview
The Rust Programming Language: an Overview
Roberto Casadei
 
Iterarators and generators in python
Iterarators and generators in pythonIterarators and generators in python
Iterarators and generators in python
Sarfaraz Ghanta
 
Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)Python 101: Python for Absolute Beginners (PyTexas 2014)
Python 101: Python for Absolute Beginners (PyTexas 2014)
Paige Bailey
 
Introduction to Python
Introduction to PythonIntroduction to Python
Introduction to Python
Nowell Strite
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
NAVER / MusicPlatform
 
1.python interpreter and interactive mode
1.python interpreter and interactive mode1.python interpreter and interactive mode
1.python interpreter and interactive mode
ManjuA8
 
Templates in C++
Templates in C++Templates in C++
Templates in C++
Tech_MX
 

Viewers also liked (20)

PyCon India 2012: Rapid development of website search in python
PyCon India 2012: Rapid development of website search in pythonPyCon India 2012: Rapid development of website search in python
PyCon India 2012: Rapid development of website search in python
Chetan Giridhar
 
Python, do you even async?
Python, do you even async?Python, do you even async?
Python, do you even async?
Saúl Ibarra Corretgé
 
Python Async IO Horizon
Python Async IO HorizonPython Async IO Horizon
Python Async IO Horizon
Lukasz Dobrzanski
 
Asynchronous web-development with Python
Asynchronous web-development with PythonAsynchronous web-development with Python
Asynchronous web-development with Python
Anton Caceres
 
How do event loops work in Python?
How do event loops work in Python?How do event loops work in Python?
How do event loops work in Python?
Saúl Ibarra Corretgé
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с gevent
Andrey Popp
 
Vert.x – The problem of real-time data binding
Vert.x – The problem of real-time data bindingVert.x – The problem of real-time data binding
Vert.x – The problem of real-time data binding
Alex Derkach
 
Cubes – pluggable model explained
Cubes – pluggable model explainedCubes – pluggable model explained
Cubes – pluggable model explained
Stefan Urbanek
 
Asynchronous I/O in Python 3
Asynchronous I/O in Python 3Asynchronous I/O in Python 3
Asynchronous I/O in Python 3
Feihong Hsu
 
Python on Rails 2014
Python on Rails 2014Python on Rails 2014
Python on Rails 2014
Albert O'Connor
 
Dive into Python Class
Dive into Python ClassDive into Python Class
Dive into Python Class
Jim Yeh
 
Faster Python, FOSDEM
Faster Python, FOSDEMFaster Python, FOSDEM
Faster Python, FOSDEM
Victor Stinner
 
Asyncio
AsyncioAsyncio
Asyncio
Andrew Svetlov
 
Python class
Python classPython class
Python class
건희 김
 
Bubbles – Virtual Data Objects
Bubbles – Virtual Data ObjectsBubbles – Virtual Data Objects
Bubbles – Virtual Data Objects
Stefan Urbanek
 
Tutorial on-python-programming
Tutorial on-python-programmingTutorial on-python-programming
Tutorial on-python-programming
Chetan Giridhar
 
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
Saúl Ibarra Corretgé
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio module
Saúl Ibarra Corretgé
 
Comandos para ubuntu 400 que debes conocer
Comandos para ubuntu 400 que debes conocerComandos para ubuntu 400 que debes conocer
Comandos para ubuntu 400 que debes conocer
Geek Advisor Freddy
 
Python master class 3
Python master class 3Python master class 3
Python master class 3
Chathuranga Bandara
 
PyCon India 2012: Rapid development of website search in python
PyCon India 2012: Rapid development of website search in pythonPyCon India 2012: Rapid development of website search in python
PyCon India 2012: Rapid development of website search in python
Chetan Giridhar
 
Asynchronous web-development with Python
Asynchronous web-development with PythonAsynchronous web-development with Python
Asynchronous web-development with Python
Anton Caceres
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с gevent
Andrey Popp
 
Vert.x – The problem of real-time data binding
Vert.x – The problem of real-time data bindingVert.x – The problem of real-time data binding
Vert.x – The problem of real-time data binding
Alex Derkach
 
Cubes – pluggable model explained
Cubes – pluggable model explainedCubes – pluggable model explained
Cubes – pluggable model explained
Stefan Urbanek
 
Asynchronous I/O in Python 3
Asynchronous I/O in Python 3Asynchronous I/O in Python 3
Asynchronous I/O in Python 3
Feihong Hsu
 
Dive into Python Class
Dive into Python ClassDive into Python Class
Dive into Python Class
Jim Yeh
 
Bubbles – Virtual Data Objects
Bubbles – Virtual Data ObjectsBubbles – Virtual Data Objects
Bubbles – Virtual Data Objects
Stefan Urbanek
 
Tutorial on-python-programming
Tutorial on-python-programmingTutorial on-python-programming
Tutorial on-python-programming
Chetan Giridhar
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio module
Saúl Ibarra Corretgé
 
Comandos para ubuntu 400 que debes conocer
Comandos para ubuntu 400 que debes conocerComandos para ubuntu 400 que debes conocer
Comandos para ubuntu 400 que debes conocer
Geek Advisor Freddy
 
Ad

Similar to Async programming and python (20)

Binary Studio Academy: Concurrency in C# 5.0
Binary Studio Academy: Concurrency in C# 5.0Binary Studio Academy: Concurrency in C# 5.0
Binary Studio Academy: Concurrency in C# 5.0
Binary Studio
 
Tornado Web Server Internals
Tornado Web Server InternalsTornado Web Server Internals
Tornado Web Server Internals
Praveen Gollakota
 
Webscraping with asyncio
Webscraping with asyncioWebscraping with asyncio
Webscraping with asyncio
Jose Manuel Ortega Candel
 
Basic Understanding and Implement of Node.js
Basic Understanding and Implement of Node.jsBasic Understanding and Implement of Node.js
Basic Understanding and Implement of Node.js
Gary Yeh
 
Training – Going Async
Training – Going AsyncTraining – Going Async
Training – Going Async
Betclic Everest Group Tech Team
 
Presentation: Everything you wanted to know about writing async, high-concurr...
Presentation: Everything you wanted to know about writing async, high-concurr...Presentation: Everything you wanted to know about writing async, high-concurr...
Presentation: Everything you wanted to know about writing async, high-concurr...
Baruch Sadogursky
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java
Baruch Sadogursky
 
Task parallel library presentation
Task parallel library presentationTask parallel library presentation
Task parallel library presentation
ahmed sayed
 
AsyncIO To Speed Up Your Crawler
AsyncIO To Speed Up Your CrawlerAsyncIO To Speed Up Your Crawler
AsyncIO To Speed Up Your Crawler
Linggar Primahastoko
 
End to-end async and await
End to-end async and awaitEnd to-end async and await
End to-end async and await
vfabro
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.js
Piotr Pelczar
 
History of asynchronous in .NET
History of asynchronous in .NETHistory of asynchronous in .NET
History of asynchronous in .NET
Marcin Tyborowski
 
Concurrecny inf sharp
Concurrecny inf sharpConcurrecny inf sharp
Concurrecny inf sharp
Riccardo Terrell
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathon
Luciano Mammino
 
Async Web Frameworks in Python
Async Web Frameworks in PythonAsync Web Frameworks in Python
Async Web Frameworks in Python
Ryan Johnson
 
HOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOP
HOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOPHOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOP
HOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOP
Mykola Novik
 
Introduction to Python Asyncio
Introduction to Python AsyncioIntroduction to Python Asyncio
Introduction to Python Asyncio
Nathan Van Gheem
 
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Codemotion
 
Building serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platformBuilding serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platform
Lucio Grenzi
 
Windows Phone 8 - 3.5 Async Programming
Windows Phone 8 - 3.5 Async ProgrammingWindows Phone 8 - 3.5 Async Programming
Windows Phone 8 - 3.5 Async Programming
Oliver Scheer
 
Binary Studio Academy: Concurrency in C# 5.0
Binary Studio Academy: Concurrency in C# 5.0Binary Studio Academy: Concurrency in C# 5.0
Binary Studio Academy: Concurrency in C# 5.0
Binary Studio
 
Tornado Web Server Internals
Tornado Web Server InternalsTornado Web Server Internals
Tornado Web Server Internals
Praveen Gollakota
 
Basic Understanding and Implement of Node.js
Basic Understanding and Implement of Node.jsBasic Understanding and Implement of Node.js
Basic Understanding and Implement of Node.js
Gary Yeh
 
Presentation: Everything you wanted to know about writing async, high-concurr...
Presentation: Everything you wanted to know about writing async, high-concurr...Presentation: Everything you wanted to know about writing async, high-concurr...
Presentation: Everything you wanted to know about writing async, high-concurr...
Baruch Sadogursky
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java
Baruch Sadogursky
 
Task parallel library presentation
Task parallel library presentationTask parallel library presentation
Task parallel library presentation
ahmed sayed
 
End to-end async and await
End to-end async and awaitEnd to-end async and await
End to-end async and await
vfabro
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.js
Piotr Pelczar
 
History of asynchronous in .NET
History of asynchronous in .NETHistory of asynchronous in .NET
History of asynchronous in .NET
Marcin Tyborowski
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathon
Luciano Mammino
 
Async Web Frameworks in Python
Async Web Frameworks in PythonAsync Web Frameworks in Python
Async Web Frameworks in Python
Ryan Johnson
 
HOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOP
HOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOPHOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOP
HOW TO DEAL WITH BLOCKING CODE WITHIN ASYNCIO EVENT LOOP
Mykola Novik
 
Introduction to Python Asyncio
Introduction to Python AsyncioIntroduction to Python Asyncio
Introduction to Python Asyncio
Nathan Van Gheem
 
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Lucio Grenzi - Building serverless applications on the Apache OpenWhisk platf...
Codemotion
 
Building serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platformBuilding serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platform
Lucio Grenzi
 
Windows Phone 8 - 3.5 Async Programming
Windows Phone 8 - 3.5 Async ProgrammingWindows Phone 8 - 3.5 Async Programming
Windows Phone 8 - 3.5 Async Programming
Oliver Scheer
 
Ad

More from Chetan Giridhar (7)

Rapid development & integration of real time communication in websites
Rapid development & integration of real time communication in websitesRapid development & integration of real time communication in websites
Rapid development & integration of real time communication in websites
Chetan Giridhar
 
Fuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FSFuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FS
Chetan Giridhar
 
Diving into byte code optimization in python
Diving into byte code optimization in python Diving into byte code optimization in python
Diving into byte code optimization in python
Chetan Giridhar
 
Testers in product development code review phase
Testers in product development   code review phaseTesters in product development   code review phase
Testers in product development code review phase
Chetan Giridhar
 
Design patterns in python v0.1
Design patterns in python v0.1Design patterns in python v0.1
Design patterns in python v0.1
Chetan Giridhar
 
PyCon India 2011: Python Threads: Dive into GIL!
PyCon India 2011: Python Threads: Dive into GIL!PyCon India 2011: Python Threads: Dive into GIL!
PyCon India 2011: Python Threads: Dive into GIL!
Chetan Giridhar
 
Pycon11: Python threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!Pycon11: Python threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!
Chetan Giridhar
 
Rapid development & integration of real time communication in websites
Rapid development & integration of real time communication in websitesRapid development & integration of real time communication in websites
Rapid development & integration of real time communication in websites
Chetan Giridhar
 
Fuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FSFuse'ing python for rapid development of storage efficient FS
Fuse'ing python for rapid development of storage efficient FS
Chetan Giridhar
 
Diving into byte code optimization in python
Diving into byte code optimization in python Diving into byte code optimization in python
Diving into byte code optimization in python
Chetan Giridhar
 
Testers in product development code review phase
Testers in product development   code review phaseTesters in product development   code review phase
Testers in product development code review phase
Chetan Giridhar
 
Design patterns in python v0.1
Design patterns in python v0.1Design patterns in python v0.1
Design patterns in python v0.1
Chetan Giridhar
 
PyCon India 2011: Python Threads: Dive into GIL!
PyCon India 2011: Python Threads: Dive into GIL!PyCon India 2011: Python Threads: Dive into GIL!
PyCon India 2011: Python Threads: Dive into GIL!
Chetan Giridhar
 
Pycon11: Python threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!Pycon11: Python threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!
Chetan Giridhar
 

Recently uploaded (20)

cloud Lecture_2025 cloud architecture.ppt
cloud Lecture_2025 cloud architecture.pptcloud Lecture_2025 cloud architecture.ppt
cloud Lecture_2025 cloud architecture.ppt
viratkohli82222
 
fHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghj
fHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghjfHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghj
fHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghj
yadavshivank2006
 
Software Developer Portfolio: Backend Architecture & Performance Optimization
Software Developer Portfolio: Backend Architecture & Performance OptimizationSoftware Developer Portfolio: Backend Architecture & Performance Optimization
Software Developer Portfolio: Backend Architecture & Performance Optimization
kiwoong (daniel) kim
 
Influence line diagram in a robust model
Influence line diagram in a robust modelInfluence line diagram in a robust model
Influence line diagram in a robust model
ParthaSengupta26
 
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptxFINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
kippcam
 
PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...
PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...
PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...
ijccmsjournal
 
"The Enigmas of the Riemann Hypothesis" by Julio Chai
"The Enigmas of the Riemann Hypothesis" by Julio Chai"The Enigmas of the Riemann Hypothesis" by Julio Chai
"The Enigmas of the Riemann Hypothesis" by Julio Chai
Julio Chai
 
May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...
May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...
May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...
gerogepatton
 
Software Engineering Project Presentation Tanisha Tasnuva
Software Engineering Project Presentation Tanisha TasnuvaSoftware Engineering Project Presentation Tanisha Tasnuva
Software Engineering Project Presentation Tanisha Tasnuva
tanishatasnuva76
 
Irja Straus - Beyond Pass and Fail - DevTalks.pdf
Irja Straus - Beyond Pass and Fail - DevTalks.pdfIrja Straus - Beyond Pass and Fail - DevTalks.pdf
Irja Straus - Beyond Pass and Fail - DevTalks.pdf
Irja Straus
 
Artificial Power 2025 raport krajobrazowy
Artificial Power 2025 raport krajobrazowyArtificial Power 2025 raport krajobrazowy
Artificial Power 2025 raport krajobrazowy
dominikamizerska1
 
International Journal of Distributed and Parallel systems (IJDPS)
International Journal of Distributed and Parallel systems (IJDPS)International Journal of Distributed and Parallel systems (IJDPS)
International Journal of Distributed and Parallel systems (IJDPS)
samueljackson3773
 
Electrical and Electronics Engineering: An International Journal (ELELIJ)
Electrical and Electronics Engineering: An International Journal (ELELIJ)Electrical and Electronics Engineering: An International Journal (ELELIJ)
Electrical and Electronics Engineering: An International Journal (ELELIJ)
elelijjournal653
 
Research_Sensitization_&_Innovative_Project_Development.pptx
Research_Sensitization_&_Innovative_Project_Development.pptxResearch_Sensitization_&_Innovative_Project_Development.pptx
Research_Sensitization_&_Innovative_Project_Development.pptx
niranjancse
 
Environmental Engineering Wastewater.pptx
Environmental Engineering Wastewater.pptxEnvironmental Engineering Wastewater.pptx
Environmental Engineering Wastewater.pptx
SheerazAhmed77
 
Cloud Computing storage saas iaas paas.pptx
Cloud Computing storage saas iaas paas.pptxCloud Computing storage saas iaas paas.pptx
Cloud Computing storage saas iaas paas.pptx
viratkohli82222
 
FISICA ESTATICA DESING LOADS CAPITULO 2.
FISICA ESTATICA DESING LOADS CAPITULO 2.FISICA ESTATICA DESING LOADS CAPITULO 2.
FISICA ESTATICA DESING LOADS CAPITULO 2.
maldonadocesarmanuel
 
Presentación Tomografía Axial Computarizada
Presentación Tomografía Axial ComputarizadaPresentación Tomografía Axial Computarizada
Presentación Tomografía Axial Computarizada
Juliana Ovalle Jiménez
 
First Review PPT gfinal gyft ftu liu yrfut go
First Review PPT gfinal gyft  ftu liu yrfut goFirst Review PPT gfinal gyft  ftu liu yrfut go
First Review PPT gfinal gyft ftu liu yrfut go
Sowndarya6
 
Pruebas y Solucion de problemas empresariales en redes de Fibra Optica
Pruebas y Solucion de problemas empresariales en redes de Fibra OpticaPruebas y Solucion de problemas empresariales en redes de Fibra Optica
Pruebas y Solucion de problemas empresariales en redes de Fibra Optica
OmarAlfredoDelCastil
 
cloud Lecture_2025 cloud architecture.ppt
cloud Lecture_2025 cloud architecture.pptcloud Lecture_2025 cloud architecture.ppt
cloud Lecture_2025 cloud architecture.ppt
viratkohli82222
 
fHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghj
fHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghjfHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghj
fHUINhKG5lM1WBBk608.pptxfhjjhhjffhiuhhghj
yadavshivank2006
 
Software Developer Portfolio: Backend Architecture & Performance Optimization
Software Developer Portfolio: Backend Architecture & Performance OptimizationSoftware Developer Portfolio: Backend Architecture & Performance Optimization
Software Developer Portfolio: Backend Architecture & Performance Optimization
kiwoong (daniel) kim
 
Influence line diagram in a robust model
Influence line diagram in a robust modelInfluence line diagram in a robust model
Influence line diagram in a robust model
ParthaSengupta26
 
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptxFINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
kippcam
 
PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...
PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...
PREDICTION OF ROOM TEMPERATURE SIDEEFFECT DUE TOFAST DEMAND RESPONSEFOR BUILD...
ijccmsjournal
 
"The Enigmas of the Riemann Hypothesis" by Julio Chai
"The Enigmas of the Riemann Hypothesis" by Julio Chai"The Enigmas of the Riemann Hypothesis" by Julio Chai
"The Enigmas of the Riemann Hypothesis" by Julio Chai
Julio Chai
 
May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...
May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...
May 2025 - Top 10 Read Articles in Artificial Intelligence and Applications (...
gerogepatton
 
Software Engineering Project Presentation Tanisha Tasnuva
Software Engineering Project Presentation Tanisha TasnuvaSoftware Engineering Project Presentation Tanisha Tasnuva
Software Engineering Project Presentation Tanisha Tasnuva
tanishatasnuva76
 
Irja Straus - Beyond Pass and Fail - DevTalks.pdf
Irja Straus - Beyond Pass and Fail - DevTalks.pdfIrja Straus - Beyond Pass and Fail - DevTalks.pdf
Irja Straus - Beyond Pass and Fail - DevTalks.pdf
Irja Straus
 
Artificial Power 2025 raport krajobrazowy
Artificial Power 2025 raport krajobrazowyArtificial Power 2025 raport krajobrazowy
Artificial Power 2025 raport krajobrazowy
dominikamizerska1
 
International Journal of Distributed and Parallel systems (IJDPS)
International Journal of Distributed and Parallel systems (IJDPS)International Journal of Distributed and Parallel systems (IJDPS)
International Journal of Distributed and Parallel systems (IJDPS)
samueljackson3773
 
Electrical and Electronics Engineering: An International Journal (ELELIJ)
Electrical and Electronics Engineering: An International Journal (ELELIJ)Electrical and Electronics Engineering: An International Journal (ELELIJ)
Electrical and Electronics Engineering: An International Journal (ELELIJ)
elelijjournal653
 
Research_Sensitization_&_Innovative_Project_Development.pptx
Research_Sensitization_&_Innovative_Project_Development.pptxResearch_Sensitization_&_Innovative_Project_Development.pptx
Research_Sensitization_&_Innovative_Project_Development.pptx
niranjancse
 
Environmental Engineering Wastewater.pptx
Environmental Engineering Wastewater.pptxEnvironmental Engineering Wastewater.pptx
Environmental Engineering Wastewater.pptx
SheerazAhmed77
 
Cloud Computing storage saas iaas paas.pptx
Cloud Computing storage saas iaas paas.pptxCloud Computing storage saas iaas paas.pptx
Cloud Computing storage saas iaas paas.pptx
viratkohli82222
 
FISICA ESTATICA DESING LOADS CAPITULO 2.
FISICA ESTATICA DESING LOADS CAPITULO 2.FISICA ESTATICA DESING LOADS CAPITULO 2.
FISICA ESTATICA DESING LOADS CAPITULO 2.
maldonadocesarmanuel
 
Presentación Tomografía Axial Computarizada
Presentación Tomografía Axial ComputarizadaPresentación Tomografía Axial Computarizada
Presentación Tomografía Axial Computarizada
Juliana Ovalle Jiménez
 
First Review PPT gfinal gyft ftu liu yrfut go
First Review PPT gfinal gyft  ftu liu yrfut goFirst Review PPT gfinal gyft  ftu liu yrfut go
First Review PPT gfinal gyft ftu liu yrfut go
Sowndarya6
 
Pruebas y Solucion de problemas empresariales en redes de Fibra Optica
Pruebas y Solucion de problemas empresariales en redes de Fibra OpticaPruebas y Solucion de problemas empresariales en redes de Fibra Optica
Pruebas y Solucion de problemas empresariales en redes de Fibra Optica
OmarAlfredoDelCastil
 

Async programming and python

  • 1. Async Programming and Python PyCon India, 2014 Chetan Giridhar
  • 2. Basics • Programming tasks: o I/O bound o CPU bound • Say, you’re doing I/O o Will it complete immediately? When will it be done? o Wont they block you?
  • 3. Blocking I/O: Example import requests r = requests.get(‘http://google.co.in’) r.status_code • What if the request takes a long time? • Operation blocks until all the data is recieved from the server Can we do something in the meanwhile? Can we run another task, concurrently?
  • 4. Non Blocking / Async • Non-blocking means the ability to make continuous progress at all times • Resources needed for a response must not be monopolized • As such it can enable both lower latency, higher throughput
  • 5. Programming Models Synchronous model time time time Threaded model Asynchronous model Task 1 Task 2 Task 3
  • 6. Math • Task = make a call to http://ip.jsontest.com • Say, Task = Task1 = Task2 = Task 3 = 400ms • Sync Model o Time taken = Task1+ Task2 + Task3 = 1.2 sec • Threaded Model o Time taken = 510 ms • Async Model o Time taken = 460 ms What’s the magic here?
  • 7. Async Paradigm • Clients requests the event driven web server; • requests are processed by event loop; • event handlers cater to events with callbacks Client Event driven server I/O loop Event driven I/O loop Request IO loop handles request Event Handlers
  • 8. Reactor Pattern • Typical non blocking frameworks work on a philosophy of single threaded event loop o keeps polling for events Reactor Pattern Waiting for Events Handling Events
  • 9. More Details! • Framework typically maintains a list of file descriptors(fd), events to monitor and corresponding event handlers for each of the fd • Listening to events on a fd is a kernel space task o epoll, [kqueue/select] – libraries provide event notifications in a non-blocking way • Epoll watches file descriptors (sockets) and returns needed (READ, WRITE & ERROR) events
  • 10. Async way • Async strategy aims for: o Making I/O tasks non blocking o I/O tasks would run independently o generate an event when tasks are complete o with help of callbacks • Benefits o No need to wait till blocking I/O tasks are complete o More responsive real time applications o Thread safety isn't an issue • Can we solve any other Python problems with this mechanism? o Eliminating GIL?
  • 11. Async in Python • Frameworks o Tornado o Twisted o Gevent • Modules o Tulip o Asyncio
  • 12. Async in Python • Frameworks o Tornado o Twisted o Gevent • Modules o Tulip o Asyncio
  • 13. Asyncio • Part of Python library o The latest module for async application development • Only for Python > 3.4 o Incompatible with prior versions • A whole new way to development o Let’s you write self contained, synchronous looking tasks o Run two infinite loops at the same time on the same thread • Works with other framework o Tornado, Twisted, GEvent
  • 14. Asyncio… • Write single threaded concurrent code • Principle of Interleaved execution of subroutines • Co-operative scheduling o Only one task at a time • Based on libevent o Select, kpoll, kqueue
  • 15. Asyncio: Components Event loop Co-routines, Futures, Tasks Transports, Protocols
  • 16. Asyncio: Components • Event loop o Register, executing and cancelling calls o Schedule execution of a task (co-routine) o Creates transport (async client and server) o Runs I/O callbacks (Watches file descriptors) o Thread interface o [BaseEventLoop.create_task()] or async() o [asyncio.get_event_loop()]
  • 17. Asyncio: Components • Co-routine o Generator (“yield from”) o suspended at preset execution points, and o resumed later by keeping track of local state o @coroutine decorator
  • 18. Asyncio: Components • Task o responsible for executing a coroutine o If coroutine yields from a future, the task suspends the execution of the coroutine and waits for the future o coroutine restarts when future is done o Subclass of class Future o [async(coroutine)] o BaseEventLoop.create_task(coro)
  • 19. Asyncio: Components • Future o A class o for results that are available later import asyncio @asyncio.coroutine def slow_operation(future): yield from asyncio.sleep(1) <- Co-routine suspend future.set_result('Future is done!') def got_result(future): print(future.result()) loop.stop() loop = asyncio.get_event_loop() <- Event loop future = asyncio.Future() <- Future object asyncio.async(slow_operation(future)) <- Task future.add_done_callback(got_result) try: loop.run_forever() finally: loop.close()
  • 20. Asyncio: Components • transport o represent connections such as sockets, SSL connection and pipes o Async socket operations • Usually frameworks implement e.g. Tornado • protocols o represent applications such as HTTP client/server, SMTP, and FTP o Async http operation o [loop.create_connection()]
  • 21. Example: Asyncio Redis import asyncio import asyncio_redis @asyncio.coroutine def my_subscriber(channels): connection = yield from asyncio_redis.Connection.create(host='localhost', port=6379) subscriber = yield from connection.start_subscribe() yield from subscriber.subscribe(channels) while True: reply = yield from subscriber.next_published() print('Received: ', repr(reply.value), 'on channel', reply.channel) loop = asyncio.get_event_loop() asyncio.async(my_subscriber('channel-1')) asyncio.async(my_subscriber('channel-2')) loop.run_forever()
  • 22. Example: Asyncio ‘Tasks’ import asyncio @asyncio.coroutine def factorial(name, number): f = 1 for i in range(2, number+1): print("Task %s: Compute factorial(%s)..." % (name, i)) yield from asyncio.sleep(1) f *= i print("Task %s: factorial(%s) = %s" % (name, number, f)) loop = asyncio.get_event_loop() tasks = [ asyncio.async(factorial("A", 2)), asyncio.async(factorial("B", 3)), asyncio.async(factorial("C", 4))] loop.run_until_complete(asyncio.wait(tasks)) loop.close()
  • 23. Async in Python • Frameworks o Tornado o Twisted o Gevent • Modules o Tulip o Asyncio
  • 24. Tornado Async • Event Loop => tornado.ioloop • Coroutine => tornado.gen.coroutine • Future => tornado.concurrent.future • Transport/Protocol => tornado.iostream • Bridge the gap => tornado.platform.asyncio – Combines asyncio and tornado in same event loop
  • 25. Tornado Async Http import tornado.ioloop from tornado.httpclient import AsyncHTTPClient def handle_request(response): '''callback needed when a response arrive''' if response.error: print("Error:", response.error) else: print(’Success') print(response.body) Before Event Loop Starts! Success b'{"ip": "117.192.252.80"}n' Callback http_client = AsyncHTTPClient() # initialize http client http_client.fetch(” http://ip.jsontest.com/", handle_request) print("Before Event Loop Starts!") tornado.ioloop.IOLoop.instance().start() # start the tornado ioloop
  • 26. Tornado Coroutine import tornado.web import tornado.gen from tornado.httpclient import AsyncHTTPClient class GenAsyncHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): http_client = AsyncHTTPClient() response = yield http_client.fetch("http://google.com") print(response) application = tornado.web.Application([ (r"/", GenAsyncHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() gen.coroutine schedules the generator to be resumed when the Future is resolved ‘yield’ makes the function a generator The generator in turn returns a Future instance In this case, response, will resolve with response from fetch or an exception
  • 27. Tornado Engine class MainHandlerAsync(tornado.web.RequestHandler): @tornado.web.asynchronous @tornado.gen.engine def get(self): req = tornado.httpclient.HTTPRequest("http://127.0.0.1:8888/",) client = tornado.httpclient.AsyncHTTPClient() response = yield tornado.gen.Task(client.fetch, req) self.finish() application = tornado.web.Application([ (r"/async", MainHandlerAsync), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8888) tornado.ioloop.IOLoop.instance().start()
  • 28. Let’s create our Future! myfuture.py server.py import time import datetime from tornado.concurrent import return_future class AsyncHTTPClient(object): @return_future def fetch(self, url, callback=None): print("In my fetch") time.sleep(0.02) result = str(datetime.datetime.utcnow()) callback(result) import tornado.web import tornado.gen from myfuture import AsyncHTTPClient def test(arg): print('In test:' + arg) class GenAsync(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): http_client = AsyncHTTPClient() r = yield http_client.fetch(“http://google.com”,test) print(r) application = tornado.web.Application([ (r"/", GenAsync),]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
  • 30. Work to be achieved
  • 31. Performance Results ab -n 500 -c 10 http://localhost:8888/blocking ab -n 500 -c 10 http://localhost:8888/async 6000 5000 4000 3000 2000 1000 0 Time per request Async Blocking Async Blocking 200 150 100 50 0 Requests per second Async Blocking Async Blocking
  • 32. Learnings • Async programming is an efficient, easy to understand design and code • Python asyncio module is comprehensive • Has generic use cases for vast variety of applications o Responsive web applications o Networking applications • Requires a new way to program and design
  • 33. Recommendations • Async programming is not a holistic solution • It has its own pros and cons o Suitable for primarily I/O bound applications o Needs enough tasks available to run • asyncio module is only available for Python 3 applications • Also explore other methods of concurrency: o Eventlets o STM o Multiprocessing/threads o Special languages e.g. GO, Scala • Understand and use 
  • 34. References • asyncio – http://python.org • Python asyncio – o http://www.buzzcapture.com o www.slideshare.net/saghul • Tornado – http://tornadoweb.org • Multithreading – www.drdobbs.com • Event loop: https://docs.python.org/3/library/asyncio-eventloop. html
  • 35. Contact Us • Chetan Giridhar o www.technobeans.com o https://github.com/cjgiridhar • Vishal Kanaujia o www.freethreads.wordpress.com o https://github.com/vishalkanaujia
  • 37. Asyncio: example import asyncio @asyncio.coroutine def create(): yield from asyncio.sleep(3.0) print("(1) create file") @asyncio.coroutine def write(): yield from asyncio.sleep(1.0) print("(2) write into file") @asyncio.coroutine def close(): print("(3) close file") @asyncio.coroutine def test(): asyncio.async(create()) asyncio.async(write()) asyncio.async(close()) yield from asyncio.sleep(2.0) loop.stop() loop = asyncio.get_event_loop() asyncio.async(test()) loop.run_forever() print("Pending tasks at exit: %s" % asyncio.Task.all_tasks(loop)) loop.close()
  • 38. Python Async Modules • Asynccore • Asyncchat • Gevent • Twisted • Eventlets
  • 39. Concurrency Techniques • Multithreading/processing • Green Threads • STM
  • 40. Tornado + AsyncIO from tornado.platform.asyncio import AsyncIOMainLoop from tornado.httpclient import AsyncHTTPClient import asyncio AsyncIOMainLoop().install() -- # Tell Tornado to use the asyncio eventloop loop = asyncio.get_event_loop() -- # get the loop http_client = AsyncHTTPClient() -- # the Tornado HTTP client def aio_fetch(client, url, **kwargs): fut = asyncio.Future() client.fetch(url, callback=fut.set_result, **kwargs) return fut @asyncio.coroutine def main(): print("fetching my site") mysite = yield from aio_fetch(http_client, "http://google.com/") print("hello httpbin") httpbin = yield from aio_fetch(http_client, "http://httpbin.org?q=%d" % mysite.code) print(httpbin.body) loop.run_until_complete(main())
  • 41. Co-routine v/s Callback import asyncio def just_print_messages(loop): print('Just print') loop.call_later(1, just_print_messages, loop) def main(): loop = asyncio.get_event_loop() try: loop.call_soon(just_print_messages, loop) loop.run_forever() finally: loop.close() if __name__ == '__main__': main() import asyncio @asyncio.coroutine def just_print_messages(): while True: print('Just print') yield from asyncio.sleep(1) def main(): loop = asyncio.get_event_loop() try: loop.run_until_complete(just_print_messages()) finally: loop.close() if __name__ == '__main__': main()
  • 42. Async in NodeJS request is an var http = require(‘http’); event var server = http.createServer; server.on(‘request’, function(request,response) { response.writeHead(200); response.end(‘Hello World’); }).listen(8001); Callback console.log(‘Server running on port 8001’);

Editor's Notes

  • #15: Event loops use cooperative scheduling: an event loop only runs one task at a time. Other tasks may run in parallel if other event loops are running in different threads. While a task waits for the completion of a future, the event loop executes a new task.
  • #17: Event loop : Central execution device BaseEventLoop.add_reader(fd, callback, *args) Start watching the file descriptor for read availability and then call the callback with specified arguments. BaseEventLoop.remove_reader(fd) Stop watching the file descriptor for read availability. BaseEventLoop.add_writer(fd, callback, *args) Start watching the file descriptor for write availability and then call the callback with specified arguments. BaseEventLoop.remove_writer(fd) Stop watching the file descriptor for write availability.
  • #20: Add an example
  • #21: A Transport represents a connection – e.g. a socket, pipe, or SSL connection • typically implemented by the framework • A Protocol represents an application – e.g. an HTTP server or client • typically implemented by you!