SlideShare une entreprise Scribd logo
1  sur  42
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’);

Contenu connexe

Tendances

Tracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracing
Tracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracingTracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracing
Tracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracingYuri Shkuro
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of DjangoJacob Kaplan-Moss
 
Introduction to Python Asyncio
Introduction to Python AsyncioIntroduction to Python Asyncio
Introduction to Python AsyncioNathan Van Gheem
 
Apache Flink Crash Course by Slim Baltagi and Srini Palthepu
Apache Flink Crash Course by Slim Baltagi and Srini PalthepuApache Flink Crash Course by Slim Baltagi and Srini Palthepu
Apache Flink Crash Course by Slim Baltagi and Srini PalthepuSlim Baltagi
 
Opentracing jaeger
Opentracing jaegerOpentracing jaeger
Opentracing jaegerOracle Korea
 
From Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHPFrom Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHPAlbert Chen
 
Grafana Loki: like Prometheus, but for Logs
Grafana Loki: like Prometheus, but for LogsGrafana Loki: like Prometheus, but for Logs
Grafana Loki: like Prometheus, but for LogsMarco Pracucci
 
2021.laravelconf.tw.slides1
2021.laravelconf.tw.slides12021.laravelconf.tw.slides1
2021.laravelconf.tw.slides1LiviaLiaoFontech
 
VictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - PreviewVictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - PreviewVictoriaMetrics
 
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...Flink Forward
 
44CON 2014 - Meterpreter Internals, OJ Reeves
44CON 2014 - Meterpreter Internals, OJ Reeves44CON 2014 - Meterpreter Internals, OJ Reeves
44CON 2014 - Meterpreter Internals, OJ Reeves44CON
 
Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Bo-Yi Wu
 
How I learned to time travel, or, data pipelining and scheduling with Airflow
How I learned to time travel, or, data pipelining and scheduling with AirflowHow I learned to time travel, or, data pipelining and scheduling with Airflow
How I learned to time travel, or, data pipelining and scheduling with AirflowPyData
 
Logs/Metrics Gathering With OpenShift EFK Stack
Logs/Metrics Gathering With OpenShift EFK StackLogs/Metrics Gathering With OpenShift EFK Stack
Logs/Metrics Gathering With OpenShift EFK StackJosef Karásek
 
RxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsRxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsBrendan Gregg
 
Introduction to Grafana Loki
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana LokiJulien Pivotto
 
Introduction to HTTP/2
Introduction to HTTP/2Introduction to HTTP/2
Introduction to HTTP/2Ido Flatow
 
Apache storm vs. Spark Streaming
Apache storm vs. Spark StreamingApache storm vs. Spark Streaming
Apache storm vs. Spark StreamingP. Taylor Goetz
 

Tendances (20)

The basics of fluentd
The basics of fluentdThe basics of fluentd
The basics of fluentd
 
Tracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracing
Tracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracingTracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracing
Tracing 2000+ polyglot microservices at Uber with Jaeger and OpenTracing
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
 
Introduction to Python Asyncio
Introduction to Python AsyncioIntroduction to Python Asyncio
Introduction to Python Asyncio
 
Apache Flink Crash Course by Slim Baltagi and Srini Palthepu
Apache Flink Crash Course by Slim Baltagi and Srini PalthepuApache Flink Crash Course by Slim Baltagi and Srini Palthepu
Apache Flink Crash Course by Slim Baltagi and Srini Palthepu
 
Opentracing jaeger
Opentracing jaegerOpentracing jaeger
Opentracing jaeger
 
From Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHPFrom Generator to Fiber the Road to Coroutine in PHP
From Generator to Fiber the Road to Coroutine in PHP
 
Concurrency With Go
Concurrency With GoConcurrency With Go
Concurrency With Go
 
Grafana Loki: like Prometheus, but for Logs
Grafana Loki: like Prometheus, but for LogsGrafana Loki: like Prometheus, but for Logs
Grafana Loki: like Prometheus, but for Logs
 
2021.laravelconf.tw.slides1
2021.laravelconf.tw.slides12021.laravelconf.tw.slides1
2021.laravelconf.tw.slides1
 
VictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - PreviewVictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - Preview
 
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
Dynamically Scaling Data Streams across Multiple Kafka Clusters with Zero Fli...
 
44CON 2014 - Meterpreter Internals, OJ Reeves
44CON 2014 - Meterpreter Internals, OJ Reeves44CON 2014 - Meterpreter Internals, OJ Reeves
44CON 2014 - Meterpreter Internals, OJ Reeves
 
Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰
 
How I learned to time travel, or, data pipelining and scheduling with Airflow
How I learned to time travel, or, data pipelining and scheduling with AirflowHow I learned to time travel, or, data pipelining and scheduling with Airflow
How I learned to time travel, or, data pipelining and scheduling with Airflow
 
Logs/Metrics Gathering With OpenShift EFK Stack
Logs/Metrics Gathering With OpenShift EFK StackLogs/Metrics Gathering With OpenShift EFK Stack
Logs/Metrics Gathering With OpenShift EFK Stack
 
RxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsRxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance Results
 
Introduction to Grafana Loki
Introduction to Grafana LokiIntroduction to Grafana Loki
Introduction to Grafana Loki
 
Introduction to HTTP/2
Introduction to HTTP/2Introduction to HTTP/2
Introduction to HTTP/2
 
Apache storm vs. Spark Streaming
Apache storm vs. Spark StreamingApache storm vs. Spark Streaming
Apache storm vs. Spark Streaming
 

En vedette

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 pythonChetan Giridhar
 
Asynchronous web-development with Python
Asynchronous web-development with PythonAsynchronous web-development with Python
Asynchronous web-development with PythonAnton Caceres
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с geventAndrey 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 bindingAlex Derkach
 
Cubes – pluggable model explained
Cubes – pluggable model explainedCubes – pluggable model explained
Cubes – pluggable model explainedStefan Urbanek
 
Asynchronous I/O in Python 3
Asynchronous I/O in Python 3Asynchronous I/O in Python 3
Asynchronous I/O in Python 3Feihong Hsu
 
Dive into Python Class
Dive into Python ClassDive into Python Class
Dive into Python ClassJim Yeh
 
Bubbles – Virtual Data Objects
Bubbles – Virtual Data ObjectsBubbles – Virtual Data Objects
Bubbles – Virtual Data ObjectsStefan Urbanek
 
Tutorial on-python-programming
Tutorial on-python-programmingTutorial on-python-programming
Tutorial on-python-programmingChetan 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 moduleSaú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 conocerGeek Advisor Freddy
 

En vedette (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
 
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
 
Asynchronous web-development with Python
Asynchronous web-development with PythonAsynchronous web-development with Python
Asynchronous web-development with Python
 
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?
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с gevent
 
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
 
Cubes – pluggable model explained
Cubes – pluggable model explainedCubes – pluggable model explained
Cubes – pluggable model explained
 
Asynchronous I/O in Python 3
Asynchronous I/O in Python 3Asynchronous I/O in Python 3
Asynchronous I/O in Python 3
 
Python on Rails 2014
Python on Rails 2014Python on Rails 2014
Python on Rails 2014
 
Dive into Python Class
Dive into Python ClassDive into Python Class
Dive into Python Class
 
Faster Python, FOSDEM
Faster Python, FOSDEMFaster Python, FOSDEM
Faster Python, FOSDEM
 
Asyncio
AsyncioAsyncio
Asyncio
 
Python class
Python classPython class
Python class
 
Bubbles – Virtual Data Objects
Bubbles – Virtual Data ObjectsBubbles – Virtual Data Objects
Bubbles – Virtual Data Objects
 
Tutorial on-python-programming
Tutorial on-python-programmingTutorial on-python-programming
Tutorial on-python-programming
 
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
 
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
 
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
 
Python master class 3
Python master class 3Python master class 3
Python master class 3
 

Similaire à Async programming and python

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.0Binary Studio
 
Tornado Web Server Internals
Tornado Web Server InternalsTornado Web Server Internals
Tornado Web Server InternalsPraveen 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.jsGary 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 presentationahmed sayed
 
End to-end async and await
End to-end async and awaitEnd to-end async and await
End to-end async and awaitvfabro
 
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.jsPiotr Pelczar
 
History of asynchronous in .NET
History of asynchronous in .NETHistory of asynchronous in .NET
History of asynchronous in .NETMarcin 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 hackathonLuciano Mammino
 
Async Web Frameworks in Python
Async Web Frameworks in PythonAsync Web Frameworks in Python
Async Web Frameworks in PythonRyan 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 LOOPMykola Novik
 
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 platformLucio 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 ProgrammingOliver Scheer
 
BUILDING APPS WITH ASYNCIO
BUILDING APPS WITH ASYNCIOBUILDING APPS WITH ASYNCIO
BUILDING APPS WITH ASYNCIOMykola Novik
 

Similaire à 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
 
Tornado Web Server Internals
Tornado Web Server InternalsTornado Web Server Internals
Tornado Web Server Internals
 
Webscraping with asyncio
Webscraping with asyncioWebscraping with asyncio
Webscraping with asyncio
 
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
 
Training – Going Async
Training – Going AsyncTraining – Going Async
Training – Going Async
 
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...
 
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
 
Task parallel library presentation
Task parallel library presentationTask parallel library presentation
Task parallel library presentation
 
AsyncIO To Speed Up Your Crawler
AsyncIO To Speed Up Your CrawlerAsyncIO To Speed Up Your Crawler
AsyncIO To Speed Up Your Crawler
 
End to-end async and await
End to-end async and awaitEnd to-end async and await
End to-end async and await
 
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
 
History of asynchronous in .NET
History of asynchronous in .NETHistory of asynchronous in .NET
History of asynchronous in .NET
 
Concurrecny inf sharp
Concurrecny inf sharpConcurrecny inf sharp
Concurrecny inf sharp
 
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
 
Async Web Frameworks in Python
Async Web Frameworks in PythonAsync Web Frameworks in Python
Async Web Frameworks in Python
 
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
 
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...
 
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
 
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
 
BUILDING APPS WITH ASYNCIO
BUILDING APPS WITH ASYNCIOBUILDING APPS WITH ASYNCIO
BUILDING APPS WITH ASYNCIO
 

Plus de 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 websitesChetan 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 FSChetan 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 phaseChetan Giridhar
 
Design patterns in python v0.1
Design patterns in python v0.1Design patterns in python v0.1
Design patterns in python v0.1Chetan 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
 

Plus de 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
 
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
 
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
 
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
 
Design patterns in python v0.1
Design patterns in python v0.1Design patterns in python v0.1
Design patterns in python v0.1
 
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!
 
Pycon11: Python threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!Pycon11: Python threads: Dive into GIL!
Pycon11: Python threads: Dive into GIL!
 

Dernier

Past, Present and Future of Generative AI
Past, Present and Future of Generative AIPast, Present and Future of Generative AI
Past, Present and Future of Generative AIabhishek36461
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catcherssdickerson1
 
Unit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfg
Unit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfgUnit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfg
Unit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfgsaravananr517913
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxKartikeyaDwivedi3
 
Solving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.pptSolving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.pptJasonTagapanGulla
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girlsssuser7cb4ff
 
Class 1 | NFPA 72 | Overview Fire Alarm System
Class 1 | NFPA 72 | Overview Fire Alarm SystemClass 1 | NFPA 72 | Overview Fire Alarm System
Class 1 | NFPA 72 | Overview Fire Alarm Systemirfanmechengr
 
Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...VICTOR MAESTRE RAMIREZ
 
Arduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.pptArduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.pptSAURABHKUMAR892774
 
IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024Mark Billinghurst
 
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfCCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfAsst.prof M.Gokilavani
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...121011101441
 
Correctly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleCorrectly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleAlluxio, Inc.
 
Why does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsync
Why does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsyncWhy does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsync
Why does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsyncssuser2ae721
 
Electronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdfElectronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdfme23b1001
 

Dernier (20)

Past, Present and Future of Generative AI
Past, Present and Future of Generative AIPast, Present and Future of Generative AI
Past, Present and Future of Generative AI
 
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor CatchersTechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
TechTAC® CFD Report Summary: A Comparison of Two Types of Tubing Anchor Catchers
 
Unit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfg
Unit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfgUnit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfg
Unit7-DC_Motors nkkjnsdkfnfcdfknfdgfggfg
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptx
 
Solving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.pptSolving The Right Triangles PowerPoint 2.ppt
Solving The Right Triangles PowerPoint 2.ppt
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Serviceyoung call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
 
Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girls
 
Class 1 | NFPA 72 | Overview Fire Alarm System
Class 1 | NFPA 72 | Overview Fire Alarm SystemClass 1 | NFPA 72 | Overview Fire Alarm System
Class 1 | NFPA 72 | Overview Fire Alarm System
 
Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...Software and Systems Engineering Standards: Verification and Validation of Sy...
Software and Systems Engineering Standards: Verification and Validation of Sy...
 
Design and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdfDesign and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdf
 
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptxExploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
 
Arduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.pptArduino_CSE ece ppt for working and principal of arduino.ppt
Arduino_CSE ece ppt for working and principal of arduino.ppt
 
IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024IVE Industry Focused Event - Defence Sector 2024
IVE Industry Focused Event - Defence Sector 2024
 
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfCCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...
 
Correctly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleCorrectly Loading Incremental Data at Scale
Correctly Loading Incremental Data at Scale
 
young call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Serviceyoung call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Service
 
Why does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsync
Why does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsyncWhy does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsync
Why does (not) Kafka need fsync: Eliminating tail latency spikes caused by fsync
 
Electronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdfElectronically Controlled suspensions system .pdf
Electronically Controlled suspensions system .pdf
 

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’);

Notes de l'éditeur

  1. 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.
  2. 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.
  3. Add an example
  4. 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!