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
0
98
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
150
Introdução a linguagem Go
allisson
0
310
Docker + Django
allisson
5
630
Construindo um micro framework web em Python
allisson
0
230
Consumindo API's OAuth{1,2} com Python
allisson
1
180
Tarefas assíncronas com django e celery
allisson
1
24k
Deploy completo de uma aplicação Django
allisson
6
500
Desenvolvimento Web com Django
allisson
0
140
Otimizando sites com o nosql redis
allisson
4
160
Other Decks in Technology
See All in Technology
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
3
340
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 完全版 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming - Expanded
tomzoh
4
3.1k
実践! AIエージェント導入記
1mono2prod
0
150
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
170
製造業からパッケージ製品まで、あらゆる領域をカバー!生成AIを利用したテストシナリオ生成 / 20250627 Suguru Ishii
shift_evolve
PRO
1
110
VISITS_AIIoTビジネス共創ラボ登壇資料.pdf
iotcomjpadmin
0
150
20250623 Findy Lunch LT Brown
3150
0
840
データプラットフォーム技術におけるメダリオンアーキテクチャという考え方/DataPlatformWithMedallionArchitecture
smdmts
5
610
GitHub Copilot の概要
tomokusaba
1
130
2年でここまで成長!AWSで育てたAI Slack botの軌跡
iwamot
PRO
4
630
解析の定理証明実践@Lean 4
dec9ue
0
160
MySQL5.6から8.4へ 戦いの記録
kyoshidaxx
1
170
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Adopting Sorbet at Scale
ufuk
77
9.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
33
5.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
330
24k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Done Done
chrislema
184
16k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Music & Morning Musume
bryan
46
6.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