SlideShare une entreprise Scribd logo
1  sur  41
Télécharger pour lire hors ligne
АСИНХРОННЫЕ СЕТЕВЫЕ ПРИЛОЖЕНИЯ НА PYTHON
ВЧЕРА, СЕГОДНЯ, ЗАВТРА
АНДРЕЙ СВЕТЛОВ
andrew.svetlov@gmail.com 
@andrew_svetlov
О СЕБЕ
Использую python 15+ лет
Python Core Developer с 2012
Соавтор asyncio
Главный разработчик aiohttp
Дюжина библиотек в сообществе aio­libs
ОПРОС
Кто использует Python 3?
Разрабатывает WEB сайты на Django/Flask
Понимает что такое асинхронное сетевое программирование
Использует асинхронные frameworks (twisted/tornado/gevent)?
ЗАЧЕМ?
1,000 потоков OS
1,000,000 легковесных задач
Hynek Schlawack
asyncio is another interesting topic. I was surprised how
alive and well that little corner of the Python community is
(albeit in mainly Russian speaking countries).
AIOHTTP ­­ АСИНХРОННЫЙ WEB
Клиент
Сервер
Перманентные соединения
Веб­сокеты
3 ГОДА ИСТОРИИ
Выделилися из asyncio (tulip)
21 releases
2800+ commits
100+ contributors
КЛИЕНТ
REQUESTS
import requests
r = requests.get('https://api.github.com/user',
auth=('user', 'pass'))
print(r.status_code)
print(r.headers['content-type'])
print(r.text)
AIOHTTP
import aiohttp
async def coro():
r = await aiohttp.get('https://api.github.com/user',
auth=aiohttp.BasicAuth('user', 'pass'))
print(r.status)
print(r.headers['content-type'])
print(await r.text())
r.close()
ПРАВИЛА ДЛЯ ASYNCIO
1. Корутина ­­ это async def
2. Вызывай корутину через await
3. Если функция содержит await ­­ сделай её корутиной
async def func():
await asyncio.sleep(1)
REQUESTS С СЕССИЕЙ
session = requests.Session()
r = session.get(url)
AIOHTTP С СЕССИЕЙ
session = aiohttp.ClientSession()
async def coro(session):
async with session.get(url) as r:
print(r.status)
print(await r.text())
ТАЙМАУТЫ
async def coro(session):
with aiohttp.Timeout(1.5):
async with session.get(url) as r:
...
ВЕБ­СОКЕТЫ
async with client.ws_connect(
'http://websocket-server.org/endpoint') as ws:
async for msg in ws:
if msg.data == 'close':
await ws.close()
break
else:
ws.send_str("Answer on " + msg.data)
СЕРВЕР
DJANGO
from django.conf.urls import url
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world")
urlpatterns = [
url(r'^$', index),
]
AIOHTTP
from aiohttp import web
async def handler(request):
return web.Response(text="Hello, world")
app = web.Application(loop=loop)
app.router.add_route('GET', '/', handler)
web.run_app(app)
TORNADO
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
app = tornado.web.Application([
(r"/", MainHandler)])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
ПОДКЛЮЧЕНИЕ БД
import sqlalchemy as sa
from aiopg.sa import create_engine
metadata = sa.MetaData()
tbl = sa.Table('tbl', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('val', sa.String(255)))
app['db'] = await create_engine(...)
async def close_db(app):
app['db'].close()
await app['db'].wait_closed()
app.on_cleanup.append(close_db)
ЗАПРОСЫ В БД
async def handler(request):
txt = ""
async with request.app['db'].acquire() as conn:
await conn.execute(tbl.insert().values(val='abc'))
async for row in conn.execute(tbl.select()):
txt += "{}: {}n".format(row.id, row.val)
return web.Response(text=txt)
СЕРВЕРНЫЕ ВЕБ­СОКЕТЫ
async def handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.data == 'close':
await ws.close()
break
else:
ws.send_str(msg.data + '/answer')
return ws
НЕТРИВИАЛЬНЫЕ ШТУЧКИ
ЖИЗНЕННЫЙ ЦИКЛ ЗАПРОСА­ОТВЕТА И
MIDDLEWARES
СЕРВЕРНЫЕ СЕССИИ
from aiohttp_session import get_session
async def hander(request):
session = await get_session(request)
session['key'] = 'value'
return web.Response()
DEBUG TOOLBAR
ASYNCIO ПОД КАПОТОМ
SELECTOR
EVENT_READ/EVENT_WRITE
register(fd, events, data=None)
unregister(fd)
select(timeout=None)
select, poll, epoll, kqueue
EVENT LOOP
add_reader(fd, callback, *args)
remove_reader(fd)
add_writer(fd, callback, *args)
remove_writer(fd)
­­­
call_soon(callback, *args)
call_later(delay, callback, *args)
ИТЕРАЦИЯ EVENT LOOP
def run_forever():
while True:
events = selector.select(timeout)
for key, mask in events:
if mask & EVENT_READ:
key.reader(key.fileobj)
if mask & EVENT_WRITE:
key.writer(key.fileobj)
for handler in ready:
handler._run()
БУФЕРЫ СОКЕТА
ТАЙМЕРЫ
ПОЛЕЗНЫЕ СОВЕТЫ
ЦИКЛ РАЗРАБОТКИ
Для разработки ­­ один процесс
Удобство запуска тестов
Разворачивать на отдельных процессах­контейнерах­узлах
PYTHONASYNCIODEBUG=1
async def f():
fut = asyncio.Future()
fut.set_exception(RuntimeError())
del fut
...
ERROR:asyncio:Future exception was never retrieved
future: Future finished exception=RuntimeError()
RuntimeError
$ PYTHONASYNCIODEBUG=x python myapp.py
ERROR:asyncio:Future exception was never retrieved
future: Future finished exception=RuntimeError() created at filename.py:10
source_traceback: Object created at (most recent call last):
...
File "filename.py", line 10, in f
fut = asyncio.Future()
RuntimeError
EXPLICIT LOOP
def request(method, url, *, loop=None):
...
loop = asyncio.get_event_loop()
await request('GET', 'http://python.org', loop=loop)
ТЕСТИРОВАНИЕ
class Test(unittest.TestCase):
def setUp(self):
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(None)
def tearDown(self):
self.loop.close()
def test_func(self):
async def go():
self.assertEqual(1, await func(loop=loop))
self.loop.run_until_complete(go())
ПРОИЗВОДИТЕЛЬНОСТЬ
Как у Tornado или Twisted
Достаточно неплохо для highload
Выдерживает миллионы online пользователей и пр.
ВОПРОСЫ?
АНДРЕЙ СВЕТЛОВ
andrew.svetlov@gmail.com
@andrew_svetlov

Contenu connexe

En vedette

Дмитрий Химион и Сергей Белов
Дмитрий Химион и Сергей БеловДмитрий Химион и Сергей Белов
Дмитрий Химион и Сергей БеловCodeFest
 
Jan Jongboom
Jan JongboomJan Jongboom
Jan JongboomCodeFest
 
Дмитрий Кулижников
Дмитрий КулижниковДмитрий Кулижников
Дмитрий КулижниковCodeFest
 
Иван Фролков
Иван ФролковИван Фролков
Иван ФролковCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Евгений Брянцев
Евгений БрянцевЕвгений Брянцев
Евгений БрянцевCodeFest
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоCodeFest
 
Денис Запорожан
Денис ЗапорожанДенис Запорожан
Денис ЗапорожанCodeFest
 
Антон Шаяхов
Антон ШаяховАнтон Шаяхов
Антон ШаяховCodeFest
 
Michael Widenius
Michael WideniusMichael Widenius
Michael WideniusCodeFest
 
Александр Лукин
Александр ЛукинАлександр Лукин
Александр ЛукинCodeFest
 
Dan Cuellar
Dan CuellarDan Cuellar
Dan CuellarCodeFest
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон ТурецкийCodeFest
 
Саша Гладких и Андрей Старков
Саша Гладких и Андрей СтарковСаша Гладких и Андрей Старков
Саша Гладких и Андрей СтарковCodeFest
 
проектная игра Pm pro et 140813
проектная игра Pm pro et 140813проектная игра Pm pro et 140813
проектная игра Pm pro et 140813Evgeny Tyrtyshny
 
Pm crowdsourcing et 190412
Pm crowdsourcing et 190412Pm crowdsourcing et 190412
Pm crowdsourcing et 190412Evgeny Tyrtyshny
 
Управление рисками
Управление рискамиУправление рисками
Управление рискамиCKPPK
 
Управление рисками: распространенные препятствия и заблуждения
Управление рисками: распространенные препятствия и заблужденияУправление рисками: распространенные препятствия и заблуждения
Управление рисками: распространенные препятствия и заблужденияAnna Grebennikova
 

En vedette (20)

Дмитрий Химион и Сергей Белов
Дмитрий Химион и Сергей БеловДмитрий Химион и Сергей Белов
Дмитрий Химион и Сергей Белов
 
Jan Jongboom
Jan JongboomJan Jongboom
Jan Jongboom
 
Дмитрий Кулижников
Дмитрий КулижниковДмитрий Кулижников
Дмитрий Кулижников
 
Иван Фролков
Иван ФролковИван Фролков
Иван Фролков
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Евгений Брянцев
Евгений БрянцевЕвгений Брянцев
Евгений Брянцев
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
Денис Запорожан
Денис ЗапорожанДенис Запорожан
Денис Запорожан
 
Антон Шаяхов
Антон ШаяховАнтон Шаяхов
Антон Шаяхов
 
Michael Widenius
Michael WideniusMichael Widenius
Michael Widenius
 
Александр Лукин
Александр ЛукинАлександр Лукин
Александр Лукин
 
Dan Cuellar
Dan CuellarDan Cuellar
Dan Cuellar
 
Asyncio
AsyncioAsyncio
Asyncio
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 
Саша Гладких и Андрей Старков
Саша Гладких и Андрей СтарковСаша Гладких и Андрей Старков
Саша Гладких и Андрей Старков
 
проектная игра Pm pro et 140813
проектная игра Pm pro et 140813проектная игра Pm pro et 140813
проектная игра Pm pro et 140813
 
Pm crowdsourcing et 190412
Pm crowdsourcing et 190412Pm crowdsourcing et 190412
Pm crowdsourcing et 190412
 
Управление рисками
Управление рискамиУправление рисками
Управление рисками
 
Управление рисками: распространенные препятствия и заблуждения
Управление рисками: распространенные препятствия и заблужденияУправление рисками: распространенные препятствия и заблуждения
Управление рисками: распространенные препятствия и заблуждения
 

Similaire à Андрей Светлов

Андрей Светлов. Aiohttp
Андрей Светлов. AiohttpАндрей Светлов. Aiohttp
Андрей Светлов. AiohttpVolha Banadyseva
 
Django. Web project full circle
Django. Web project full circleDjango. Web project full circle
Django. Web project full circleOlexiy Strashko
 
Django. Web project full circle
Django. Web project full circleDjango. Web project full circle
Django. Web project full circlewebriders
 
Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примереSergey Xek
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 
Python-технология которую легко продавать!
Python-технология которую легко продавать!Python-технология которую легко продавать!
Python-технология которую легко продавать!Aleksey Nakorenko
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программированиеPython Meetup
 
11 melnikov blogs_arbicon
11 melnikov blogs_arbicon11 melnikov blogs_arbicon
11 melnikov blogs_arbiconunilib
 
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»DataArt
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27MoscowJS
 
Доклад не про React
Доклад не про ReactДоклад не про React
Доклад не про ReactAnton Winogradov
 
Ag Systran 2008 04 26
Ag Systran 2008 04 26Ag Systran 2008 04 26
Ag Systran 2008 04 26NLPseminar
 

Similaire à Андрей Светлов (14)

Андрей Светлов. Aiohttp
Андрей Светлов. AiohttpАндрей Светлов. Aiohttp
Андрей Светлов. Aiohttp
 
Django. Web project full circle
Django. Web project full circleDjango. Web project full circle
Django. Web project full circle
 
Django. Web project full circle
Django. Web project full circleDjango. Web project full circle
Django. Web project full circle
 
Путь к Go на конкретном примере
Путь к Go на конкретном примереПуть к Go на конкретном примере
Путь к Go на конкретном примере
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Invisible
InvisibleInvisible
Invisible
 
Python-технология которую легко продавать!
Python-технология которую легко продавать!Python-технология которую легко продавать!
Python-технология которую легко продавать!
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программирование
 
11 melnikov blogs_arbicon
11 melnikov blogs_arbicon11 melnikov blogs_arbicon
11 melnikov blogs_arbicon
 
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
Виктор Сергиенко «Асинхронный IO-boundPython: миф или реальность?»
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27
 
Доклад не про React
Доклад не про ReactДоклад не про React
Доклад не про React
 
Ag Systran 2008 04 26
Ag Systran 2008 04 26Ag Systran 2008 04 26
Ag Systran 2008 04 26
 
2to3
2to32to3
2to3
 

Plus de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Plus de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

Андрей Светлов