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
Allisson Azevedo
March 25, 2017
Technology
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Programação Assíncrona com Asyncio
Palestra ministrada no PythonDay Campina Grande 2017
Allisson Azevedo
March 25, 2017
More Decks by Allisson Azevedo
See All by Allisson Azevedo
Crawleando sites com NodeJS
allisson
0
190
Introdução a linguagem Go
allisson
0
350
Docker + Django
allisson
5
700
Construindo um micro framework web em Python
allisson
0
260
Consumindo API's OAuth{1,2} com Python
allisson
1
220
Tarefas assíncronas com django e celery
allisson
1
24k
Deploy completo de uma aplicação Django
allisson
6
540
Desenvolvimento Web com Django
allisson
0
160
Otimizando sites com o nosql redis
allisson
4
190
Other Decks in Technology
See All in Technology
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1.2k
個人OSSが、机の上から世界に広がるまでの話
shinyasaita
1
300
A Bag-of-Documents Model for Query Specificity
dtunkelang
0
200
新しい SLO が良い感じにハマっている話
z63d
4
2k
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
0
200
Issue設計から始める仕様駆動開発 / 20260731 Mizuki Hirata
shift_evolve
PRO
1
100
QAタスクをスキル化したいときに考えること
aomoriringo
0
150
ガバメントクラウドでのランサムウェア対策
techniczna
1
610
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
0
110
LangfuseによるLLMOps基盤の構築と活用事例
zozotech
PRO
1
250
Retriever と Reranker、結局どうする?
kazuaki
2
600
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
230
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
390
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Done Done
chrislema
186
16k
Documentation Writing (for coders)
carmenintech
77
5.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
How to Ace a Technical Interview
jacobian
281
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
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