Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Programação Assíncrona com Asyncio
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Allisson Azevedo
March 25, 2017
Technology
0
120
Programação Assíncrona com Asyncio
Palestra ministrada no PythonDay Campina Grande 2017
Allisson Azevedo
March 25, 2017
Tweet
Share
More Decks by Allisson Azevedo
See All by Allisson Azevedo
Crawleando sites com NodeJS
allisson
0
170
Introdução a linguagem Go
allisson
0
320
Docker + Django
allisson
5
660
Construindo um micro framework web em Python
allisson
0
240
Consumindo API's OAuth{1,2} com Python
allisson
1
200
Tarefas assíncronas com django e celery
allisson
1
24k
Deploy completo de uma aplicação Django
allisson
6
520
Desenvolvimento Web com Django
allisson
0
150
Otimizando sites com o nosql redis
allisson
4
180
Other Decks in Technology
See All in Technology
AI時代、1年目エンジニアの悩み
jin4
1
150
セキュリティ はじめの一歩
nikinusu
0
1.5k
30万人の同時アクセスに耐えたい!新サービスの盤石なリリースを支える負荷試験 / SRE Kaigi 2026
genda
1
150
Deno・Bunの標準機能やElysiaJSを使ったWebSocketサーバー実装 / ラーメン屋を貸し切ってLT会! IoTLT 2026新年会
you
PRO
0
260
AIと新時代を切り拓く。これからのSREとメルカリIBISの挑戦
0gm
0
660
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
320
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
Databricks Free Edition講座 データサイエンス編
taka_aki
0
290
GSIが複数キー対応したことで、俺達はいったい何が嬉しいのか?
smt7174
3
130
レガシー共有バッチ基盤への挑戦 - SREドリブンなリアーキテクチャリングの取り組み
tatsukoni
0
190
2026年、サーバーレスの現在地 -「制約と戦う技術」から「当たり前の実行基盤」へ- /serverless2026
slsops
2
200
データの整合性を保ちたいだけなんだ
shoheimitani
6
2.4k
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
71
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
Speed Design
sergeychernyshev
33
1.5k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
54
AI: The stuff that nobody shows you
jnunemaker
PRO
2
240
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
170
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Automating Front-end Workflow
addyosmani
1371
200k
Testing 201, or: Great Expectations
jmmastey
46
8k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
110
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
Transcript
PROGRAMAÇÃO ASSÍNCRONA COM ASYNCIO PythonDay Campina Grande 2017 Allisson Azevedo
1
ALLISSON AZEVEDO allissonazevedo.com youtube.com/user/allissonazevedo github.com/allisson twitter.com/allisson linkedin.com/in/allisson/ allisson.github.io/slides/
[email protected]
2
THE C10K PROBLEM Como lidar com 10k conexões simultâneas http://www.kegel.com/c10k.html
3
CONCORRÊNCIA Asynchronous I/O O exemplo do garçom Não confundir com
paralelismo 4
PROGRAMAÇÃO SÍNCRONA import time import requests from github import REPOS,
ACCESS_TOKEN start = time.time() for repo_url in REPOS: response = requests.get(repo_url, params={'access_token': ACCESS repo_info = { 'name': response['name'], 'full_name': response['full_name'], 'stargazers_count': response['stargazers_count'] } print(repo_info) end = time.time() print('Tempo de execução={:.2f} segundos'.format(end - start)) 5
PROBLEMAS COM PROGRAMAÇÃO SÍNCRONA Uma requisição http por vez 6
CONCORRÊNCIA USANDO THREADS import time import threading import queue import
requests from github import REPOS, ACCESS_TOKEN def grab_data_from_queue(): while not q.empty(): repo_url = q.get() response = requests.get(repo_url, params={'access_token' repo_info = { 'name': response['name'], 'full_name': response['full_name'], 'stargazers_count': response['stargazers_count'] } 7
PROBLEMAS COM THREADS Consumo de recursos Global Interpreter Lock (GIL)
8
CONCORRÊNCIA USANDO PROCESS import time import multiprocessing import requests from
github import REPOS, ACCESS_TOKEN def grab_data_from_queue(): while not q.empty(): repo_url = q.get() response = requests.get(repo_url, params={'access_token' repo_info = { 'name': response['name'], 'full_name': response['full_name'], 'stargazers_count': response['stargazers_count'] } print(repo_info) 9
PROBLEMAS COM PROCESS Consumo de recursos 10
CONCORRÊNCIA USANDO CONCURRENT.FUTURES import time from concurrent import futures import
requests from github import REPOS, ACCESS_TOKEN def get_repo_info(repo_url): response = requests.get(repo_url, params={'access_token': ACCESS repo_info = { 'name': response['name'], 'full_name': response['full_name'], 'stargazers_count': response['stargazers_count'] } print(repo_info) 11
PROBLEMAS COM CONCURRENT.FUTURES ThreadPoolExecutor - usa threads ProcessPoolExecutor - usa
process 12
ASYNCHRONOUS I/O COM PYTHON Twisted Tornado Eventlet Gevent Asyncio 13
ASYNCIO Python 3.4+ Tulip PEP-3156 14
HELLO WORLD import asyncio async def hello_world(): print('Hello World!') loop
= asyncio.get_event_loop() loop.run_until_complete(hello_world()) 15
HELLO WORLD COM TASKS import asyncio async def hello_world(name): print('Hello
World, {}!'.format(name)) loop = asyncio.get_event_loop() tasks = [] for name in ('fulano', 'cicrano', 'beltrano'): task = asyncio.ensure_future(hello_world(name)) tasks.append(task) loop.run_until_complete(asyncio.wait(tasks)) 16
CONCORRÊNCIA USANDO ASYNCIO import time import asyncio import aiohttp from
github import REPOS, ACCESS_TOKEN async def get_repo_info(repo_url): async with aiohttp.ClientSession() as session: async with session.get(repo_url, params={'access_token': ACC response_data = await response.json() repo_info = { 'name': response_data['name'], 'full_name': response_data['full_name'], 'stargazers_count': response_data['stargazers_count' } print(repo_info) 17
AIO LIBS https://github.com/aio-libs https://github.com/python/asyncio/wiki/ThirdParty 18
PACO import time import paco import aiohttp from github import
REPOS, ACCESS_TOKEN async def get_repo_info(repo_url): async with aiohttp.ClientSession() as session: async with session.get(repo_url, params={'access_token': ACC response_data = await response.json() repo_info = { 'name': response_data['name'], 'full_name': response_data['full_name'], 'stargazers_count': response_data['stargazers_count' } print(repo_info) 19
AIOHTTP from aiohttp import web async def handle(request): return web.json_response({'message':
'Hello World'}) app = web.Application() app.router.add_get('/', handle) web.run_app(app, host='127.0.0.1', port=8080) 20
SANIC from sanic import Sanic from sanic.response import json app
= Sanic() @app.route('/') async def test(request): return json({'message': 'Hello World'}) if __name__ == '__main__': app.run(host='127.0.0.1', port=8080) 21
AIOREDIS import asyncio import aioredis loop = asyncio.get_event_loop() async def
main(): redis = await aioredis.create_redis(('localhost', 6379), loop=lo await redis.set('key', 'hello world') val = await redis.get('key') print(val) redis.close() await redis.wait_closed() loop.run_until_complete(main()) 22
AIOMCACHE import asyncio import aiomcache loop = asyncio.get_event_loop() async def
main(): mc = aiomcache.Client('127.0.0.1', 11211, loop=loop) await mc.set(b'key', b'hello world') value = await mc.get(b'key') print(value) loop.run_until_complete(main()) 23
AIOPG import asyncio import aiopg from speakers import SPEAKERS dsn
= 'dbname=pythonday user=pythonday password=pythonday host=127. async def get_pool(): return await aiopg.create_pool(dsn) async def create_table(): pool = await get_pool() async with pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute('DROP TABLE IF EXISTS speakers') 24
AIOPG SQLALCHEMY import asyncio from aiopg.sa import create_engine import sqlalchemy
as sa from speakers import SPEAKERS metadata = sa.MetaData() speakers_table = sa.Table( 'speakers', metadata, sa.Column('id', sa.Integer, primary_key=True), sa.Column('name', sa.String(255)) ) async def get_engine(): return await create_engine( 25
PYTEST-ASYNCIO import pytest import aiohttp from github import REPOS, ACCESS_TOKEN
async def get_repo_info(repo_url): async with aiohttp.ClientSession() as session: async with session.get(repo_url, params={'access_token': ACC response_data = await response.json() return { 'name': response_data['name'], 'full_name': response_data['full_name'], 'stargazers_count': response_data['stargazers_count' } 26
PERGUNTAS? 27
OBRIGADO! 28