Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Programação Assíncrona com Asyncio

Programação Assíncrona com Asyncio

Palestra ministrada no PythonDay Campina Grande 2017

Allisson Azevedo

March 25, 2017
Tweet

More Decks by Allisson Azevedo

Other Decks in Technology

Transcript

  1. 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
  2. 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
  3. 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
  4. 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
  5. HELLO WORLD import asyncio async def hello_world(): print('Hello World!') loop

    = asyncio.get_event_loop() loop.run_until_complete(hello_world()) 15
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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