EuroPython 2015, Bilbao
Victor Stinner
vstinner@redhat.com
Distributed under CC BY-SA license: http://creativecommons.org/...
Python core developer since 5 years
Senior Software Engineer at Red Hat
Port OpenStack to Python 3
Working remotely from S...
Python 3.4.0: March 2014
Bare: almost no library
Asyncio launch
python-tulip mailing list (Google Group)
#asyncio IRC channel on Freenode
https://github.com/python/asyncio
Python bug tra...
Most famous and successful library
HTTP client and server
HTTPS
Client and server Websocket
https://aiohttp.rtfd.org/
aioh...
@asyncio.coroutine
def fetch_page(url):
req = yield from aiohttp.request('GET', url)
assert req.status == 200
return (yiel...
MySQL: aiomysql
PostgreSQL: aiopg (based on
psycopg2)
SQL drivers
dsn = 'dbname=aiopg host=127.0.0.1 user=…'
@asyncio.coroutine
def go():
pool = yield from aiopg.create_pool(dsn)
with (yie...
peewee: peewee-async
SQLAlchemy: aiopg.sa
ORM
memcached: aiomemcache
redis: aioredis
redis: asyncio-redis
Key-value stores
@asyncio.coroutine
def wait_each_command():
foo = yield from redis.get('foo')
bar = yield from redis.incr('bar')
return fo...
@asyncio.coroutine
def pipelined():
get = redis.get('foo')
incr = redis.incr('bar')
foo, bar = yield from asyncio.gather(g...
CouchDB: aiocouchdb
MongoDB: asyncio-mongodb
NoSQL
DNS: aiodns (async resolver)
IRC: bottom
IRC: irc3
SSH: AsyncSSH
XMPP (Jabber): slixmpp
Clients
AMI: panoramisk (AMI and FastAGI)
AMQP: aioamqp
ElasticSearch: aioes
Etcd: aioetcd
Google Hangouts: hangups
More clients
aiopyramid
aiowsgi
interest
Muffin
API hour
Web frameworks
nacho
Pulsar
rainfall
Vase
aiohttp.web
AutobahnPython
websockets
WebSocket-for-Python
Websockets
FastAGI (Asterisk): panoramisk
IRC: irc3.irc3d
HTTP: aiohttp
SSH: AsyncSSH
Servers
@asyncio.coroutine
def hello(request):
return web.Response(body=b"Hello, world")
app = web.Application()
app.router.add_ro...
@asyncio.coroutine
def stats(request):
body = yield from get_stats()
return web.Response(body=body)
app.router.add_route('...
asynctest: for unittest
pytest-asyncio: for pytest
aiotest (test asyncio implementation)
Unit tests
Trollius is the Python 2 port of asyncio
Work on Python 2.6 – 3.5
Use “yield From(...)”
instead of “yield from ...”
Only a...
Ludovic Gasc ran benchmark on Flask,
Django and API Hour (asyncio)
API Hour is as fast or much faster
Best case: API-Hour ...
Need tutorials and more
documentation
Port more stdlib modules to asyncio:
ftplib, poplib, imaplib, nntplib, smtplib,
teln...
Questions?
http://www.asyncio.org/
github.com/python/asyncio/wiki/ThirdParty
Distributed under CC BY-SA license: http://cr...
Prochain SlideShare
Chargement dans…5
×

asyncio community, one year later

1 009 vues

Publié le



The asyncio project was officially launched with the release of Python 3.4 in March 2014. The project was public before that under the name “tulip”. asyncio is just a core network library, it requires third party library to be usable for common protocols. One year later, asyncio has a strong community writing libraries on top of it.

The most advanced library is aiohttp which includes a complete HTTP client but also a HTTP server. There are also libraries to access asynchronously the file system, resolve names with DNS, have variables local to tasks, read-write locks, etc. There are clients for AMQP, Asterisk, ElasticSearch, IRC, XMPP (Jabber), etc. (and even an IRC server!). There are asynchronous drivers for all common databases, and even for some ORMs. As expected, there are tons of new web frameworks based on asyncio. It’s also possible to plug asyncio into Gtk, Qt, gevent, eventlet, gunicorn, tornado, etc.

I will also discuss use cases of asyncio in production and benchmarks. Spoiler: asyncio is not slow.

The asyncio library also evolved to become more usable: it has a better documentation, is easier to debug and has a few new functions. There is also a port to Python 2: trollius.

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

asyncio community, one year later

  1. 1. EuroPython 2015, Bilbao Victor Stinner vstinner@redhat.com Distributed under CC BY-SA license: http://creativecommons.org/licenses/by-sa/3.0/ Asyncio community one year later
  2. 2. Python core developer since 5 years Senior Software Engineer at Red Hat Port OpenStack to Python 3 Working remotely from South of France Victor Stinner
  3. 3. Python 3.4.0: March 2014 Bare: almost no library Asyncio launch
  4. 4. python-tulip mailing list (Google Group) #asyncio IRC channel on Freenode https://github.com/python/asyncio Python bug tracker (bugs.python.org) More and more conferences! Community
  5. 5. Most famous and successful library HTTP client and server HTTPS Client and server Websocket https://aiohttp.rtfd.org/ aiohttp
  6. 6. @asyncio.coroutine def fetch_page(url): req = yield from aiohttp.request('GET', url) assert req.status == 200 return (yield from req.read()) aiohttp client example
  7. 7. MySQL: aiomysql PostgreSQL: aiopg (based on psycopg2) SQL drivers
  8. 8. dsn = 'dbname=aiopg host=127.0.0.1 user=…' @asyncio.coroutine def go(): pool = yield from aiopg.create_pool(dsn) with (yield from pool.cursor()) as cur: yield from cur.execute("SELECT 1") row = yield from cur.fetchone() assert row == (1,) aiopg example
  9. 9. peewee: peewee-async SQLAlchemy: aiopg.sa ORM
  10. 10. memcached: aiomemcache redis: aioredis redis: asyncio-redis Key-value stores
  11. 11. @asyncio.coroutine def wait_each_command(): foo = yield from redis.get('foo') bar = yield from redis.incr('bar') return foo, bar aioredis example
  12. 12. @asyncio.coroutine def pipelined(): get = redis.get('foo') incr = redis.incr('bar') foo, bar = yield from asyncio.gather(get, incr) return foo, bar aioredis pipeline example
  13. 13. CouchDB: aiocouchdb MongoDB: asyncio-mongodb NoSQL
  14. 14. DNS: aiodns (async resolver) IRC: bottom IRC: irc3 SSH: AsyncSSH XMPP (Jabber): slixmpp Clients
  15. 15. AMI: panoramisk (AMI and FastAGI) AMQP: aioamqp ElasticSearch: aioes Etcd: aioetcd Google Hangouts: hangups More clients
  16. 16. aiopyramid aiowsgi interest Muffin API hour Web frameworks nacho Pulsar rainfall Vase
  17. 17. aiohttp.web AutobahnPython websockets WebSocket-for-Python Websockets
  18. 18. FastAGI (Asterisk): panoramisk IRC: irc3.irc3d HTTP: aiohttp SSH: AsyncSSH Servers
  19. 19. @asyncio.coroutine def hello(request): return web.Response(body=b"Hello, world") app = web.Application() app.router.add_route('GET', '/', hello) aiohttp server
  20. 20. @asyncio.coroutine def stats(request): body = yield from get_stats() return web.Response(body=body) app.router.add_route('GET', '/stats', stats) aiohttp server
  21. 21. asynctest: for unittest pytest-asyncio: for pytest aiotest (test asyncio implementation) Unit tests
  22. 22. Trollius is the Python 2 port of asyncio Work on Python 2.6 – 3.5 Use “yield From(...)” instead of “yield from ...” Only a few asyncio libraries are compatible with trollius Only use it if you cannot port your application to Python 3 Trollius
  23. 23. Ludovic Gasc ran benchmark on Flask, Django and API Hour (asyncio) API Hour is as fast or much faster Best case: API-Hour handles 5x more requests per second JSON serialization: 400k req/s API- Hour vs 70-79k for Django-Flask Details: http://blog.gmludo.eu/ Benchmarks
  24. 24. Need tutorials and more documentation Port more stdlib modules to asyncio: ftplib, poplib, imaplib, nntplib, smtplib, telnetlib, xmlrpclib, etc. Interoperability with Twisted How can you help?
  25. 25. Questions? http://www.asyncio.org/ github.com/python/asyncio/wiki/ThirdParty Distributed under CC BY-SA license: http://creativecommons.org/licenses/by-sa/3.0/ Contact : vstinner@gmail.com

×