SlideShare a Scribd company logo
1 of 45
Download to read offline
про асинхронное сетевое
программирование
Стас Рудаков
Да что мы всё обо мне, да обо мне. . .
Про асинхронное сетевое программирование и Python, Стас Рудаков
О чем будем говорить
Что нам дает асинхронность
Как это работает
Twisted
Gevent
Tornado
PEP 3156
https://raw.github.com/nott/talks/master/async.pdf
Про асинхронное сетевое программирование и Python, Стас Рудаков
Работа с сетью: зачем что-то изобретать?
1 #!/usr/bin/env python2
2 import urllib2
3 f = urllib2.urlopen(’http :// python.org/’)
4 print f.read (10)
Listing 1: urllib_example.py
Про асинхронное сетевое программирование и Python, Стас Рудаков
Работа с сетью: зачем что-то изобретать?
1 #!/usr/bin/env python2
2 import urllib2
3 f = urllib2.urlopen(’http :// python.org/’)
4 print f.read (10)
Listing 2: urllib_example.py
1 $ time python urllib_example.py
2 <!DOCTYPE
3
4 real 0m0 .384s
5 user 0m0 .067s
6 sys 0m0 .017s
Про асинхронное сетевое программирование и Python, Стас Рудаков
Работа с сетью: зачем что-то изобретать?
1 #!/usr/bin/env python2
2 import urllib2
3 f = urllib2.urlopen(’http :// python.org/’)
4 print f.read (10)
Listing 3: urllib_example.py
1 $ time python urllib_example.py
2 <!DOCTYPE
3
4 real 0m0 .384s
5 user 0m0 .067s
6 sys 0m0 .017s
time
Про асинхронное сетевое программирование и Python, Стас Рудаков
Работа с сетью: дальше будет только хуже
1 #!/usr/bin/env python2
2 import sys
3 import urllib2
4 for i in xrange (5):
5 f = urllib2.urlopen(’http :// python.org/’)
6 print f.read (10) ,
Listing 4: urllib_example2.py
Про асинхронное сетевое программирование и Python, Стас Рудаков
Работа с сетью: дальше будет только хуже
1 #!/usr/bin/env python2
2 import sys
3 import urllib2
4 for i in xrange (5):
5 f = urllib2.urlopen(’http :// python.org/’)
6 print f.read (10) ,
Listing 5: urllib_example2.py
1 $ time python urllib_example2 .py
2 <!DOCTYPE <!DOCTYPE <!DOCTYPE
3
4 real 0m1 .007s
5 user 0m0 .050s
6 sys 0m0 .003s
Про асинхронное сетевое программирование и Python, Стас Рудаков
Работа с сетью: дальше будет только хуже
1 #!/usr/bin/env python2
2 import sys
3 import urllib2
4 for i in xrange (5):
5 f = urllib2.urlopen(’http :// python.org/’)
6 print f.read (10) ,
Listing 6: urllib_example2.py
1 $ time python urllib_example2 .py
2 <!DOCTYPE <!DOCTYPE <!DOCTYPE
3
4 real 0m1 .007s
5 user 0m0 .050s
6 sys 0m0 .003s
time/3
Про асинхронное сетевое программирование и Python, Стас Рудаков
I know, I’ll use. . .
time
Про асинхронное сетевое программирование и Python, Стас Рудаков
I know, I’ll use. . .
time
Some people, when confronted with a problem, think,
"I know, I’ll use threads,"
and then two they hav erpoblesms. (Ned Batchelder)
Про асинхронное сетевое программирование и Python, Стас Рудаков
I know, I’ll use. . .
time
Some people, when confronted with a problem, think,
"I know, I’ll use threads,"
and then two they hav erpoblesms. (Ned Batchelder)
time
Про асинхронное сетевое программирование и Python, Стас Рудаков
Apache vs Nginx
Про асинхронное сетевое программирование и Python, Стас Рудаков
Apache vs Nginx
Apache
time
Nginx
time
Про асинхронное сетевое программирование и Python, Стас Рудаков
Лампочка
Про асинхронное сетевое программирование и Python, Стас Рудаков
Event loop
EVENT LOOP
your code
socket
is ready
wait for
events
(poll, epoll, etc.)
Про асинхронное сетевое программирование и Python, Стас Рудаков
Event loop in GUI
1 def OnClose(self , event):
2 dlg = wx.MessageDialog(self ,
3 "Do you really want to close this application?",
4 "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
5 result = dlg.ShowModal ()
6 dlg.Destroy ()
7 if result == wx.ID_OK:
8 self.Destroy ()
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: transport vs protocol
Транспорт
знает, как пересылать байты
примеры: socket, UNIX pipe,
SSL socket, etc.
Протокол
знает, какие байты пересылать
примеры: HTTP, SMTP, XMPP,
Memcached, etc.
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: transport vs protocol на примере
1 #!/usr/bin/env python2
2 from twisted.internet import reactor , protocol
3 class Counter(protocol.Protocol):
4 def __init__(self , factory):
5 self.factory = factory
6 def connectionMade (self):
7 num = self.factory.num = self.factory.num + 1
8 self.transport.write("open connections: %dn" % num)
9 def connectionLost (self , reason):
10 self.factory.num -= 1
11 dataReceived = lambda self , data: None
12 class CounterFactory(protocol.Factory):
13 def __init__(self):
14 self.num = 0
15 buildProtocol = lambda self , addr: Counter(self)
16 reactor.listenTCP (8123 , CounterFactory ())
17 reactor.run()
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: transport vs protocol
1 $ telnet 127.0.0.1 8123
2 Trying 127.0.0.1...
3 Connected to 127.0.0.1.
4 Escape character is ’^]’.
5 open connections: 2
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: Deferred
Deferred — обещание вернуть результат.
К нему прикрепляются callback’и и errback’и.
Само использование Deferred еще не делает программу асинхронной.
Важно, чтобы callback’и вызывались по событиям (в любых смыслах).
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: Deferred на примере
1 #!/usr/bin/env python2
2 import sys
3 from twisted.internet import defer , reactor
4 from twisted.python.util import println
5 from twisted.web.client import getPage
6
7 results = []
8 for i in xrange(int(sys.argv [1])):
9 d = getPage(’http :// www.python.org/’)
10 d.addCallback(lambda value: value [:10])
11 d.addCallback(lambda value: println(value [:: -1]))
12 d.addErrback(lambda error: println("error:", error))
13 results.append(d)
14
15 d_list = defer.DeferredList(results)
16 d_list.addBoth(lambda ignored: reactor.stop ())
17 reactor.run()
Listing 7: twisted_example.pyПро асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: Deferred
1 $ time python twisted_example.py 1
2 EPYTCOD!<
3
4 real 0m0 .833s
5 user 0m0 .250s
6 sys 0m0 .030s
7 $ time python twisted_example.py 5
8 EPYTCOD!<
9 EPYTCOD!<
10 EPYTCOD!<
11 EPYTCOD!<
12 EPYTCOD!<
13
14 real 0m1 .116s
15 user 0m0 .257s
16 sys 0m0 .043s
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: параллельная вселенная
последовательность синхронных операторов ≈ цепочка Deferred;
вызов функции внутри функции ≈ возврат Deferred из Deferred;
Deferred ≈ stack frame;
блок try..except ≈ цепочка errback’ов;
threading.join ≈ DeferredList;
Про асинхронное сетевое программирование и Python, Стас Рудаков
Twisted: параллельная вселенная
последовательность синхронных операторов ≈ цепочка Deferred;
вызов функции внутри функции ≈ возврат Deferred из Deferred;
Deferred ≈ stack frame;
блок try..except ≈ цепочка errback’ов;
threading.join ≈ DeferredList;
logging;
plugins;
несовместимость с stdlib;
отлично проработанная инфраструктура;
достаточно (но далеко не самый) быстрый;
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent
и прекрасный код
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent
1 #!/usr/bin/python2
2 import sys
3 from gevent import joinall , monkey , spawn
4
5 monkey.patch_all ()
6
7 import urllib2
8
9 def fetch ():
10 f = urllib2.urlopen(’http :// www.python.org/’)
11 print f.read (10)
12
13 num = int(sys.argv [1])
14 # equivalent can be also implemented with threading
15 joinall ([ spawn(fetch) for i in xrange(num)])
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent: oh wow!
1 $ time python gevent_example.py 1
2 <!DOCTYPE
3
4 real 0m0 .434s
5 user 0m0 .077s
6 sys 0m0 .020s
7
8 $ time python gevent_example.py 5
9 <!DOCTYPE
10 <!DOCTYPE
11 <!DOCTYPE
12 <!DOCTYPE
13 <!DOCTYPE
14
15 real 0m0 .428s
16 user 0m0 .093s
17 sys 0m0 .023s
Про асинхронное сетевое программирование и Python, Стас Рудаков
Greenlets inside
1 #!/usr/bin/env python
2 from greenlet import greenlet
3
4 def test1 ():
5 print (1)
6 gr2.switch ()
7 print (3)
8 def test2 ():
9 print (2)
10 gr1.switch ()
11 print (4)
12
13 gr1 = greenlet(test1)
14 gr2 = greenlet(test2)
15 gr1.switch ()
Listing 8: greenlet_example.py
$ python greenlet_example .py
1
2
3
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent: есть нюанс
Текущая версия 0.13.
В версии 1.0 запланирован переход с libevent на libev.
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent: есть нюанс
Текущая версия 0.13.
В версии 1.0 запланирован переход с libevent на libev.
Первая β-версия для 1.0 была выпущена около 2 лет назад.
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent: есть нюанс
Текущая версия 0.13.
В версии 1.0 запланирован переход с libevent на libev.
Первая β-версия для 1.0 была выпущена около 2 лет назад.
Пугают страшилки про гринлеты.
Про асинхронное сетевое программирование и Python, Стас Рудаков
Gevent: есть нюанс
Текущая версия 0.13.
В версии 1.0 запланирован переход с libevent на libev.
Первая β-версия для 1.0 была выпущена около 2 лет назад.
Пугают страшилки про гринлеты.
Проблемы с совместимостью с существующими библиотеками.
Про асинхронное сетевое программирование и Python, Стас Рудаков
Tornado
и быстрые HTTP серверы
Про асинхронное сетевое программирование и Python, Стас Рудаков
Tornado
1 #!/usr/bin/env python
2 import tornado.ioloop
3 import tornado.httpclient
4 import tornado.web
5
6 class Handler(tornado.web.RequestHandler):
7 @tornado.web.asynchronous
8 def get(self , path):
9 http = tornado.httpclient. AsyncHTTPClient ()
10 http.fetch("http :// www.python.org/" + path ,
11 self._on_download)
12 def _on_download(self , response):
13 self.write(response.body)
14 self.finish ()
15 application = tornado.web.Application ([(r"/(.*)", Handler) ,])
16 application.listen (8888)
17 tornado.ioloop.IOLoop.instance ().start ()
Про асинхронное сетевое программирование и Python, Стас Рудаков
Tornado: we need an HTTP client!
1 #!/usr/bin/env python
2 import sys , tornado.ioloop , tornado.httpclient
3
4 def fetch ():
5 http = tornado.httpclient. AsyncHTTPClient ()
6 http.fetch("http :// www.python.org/", on_download)
7 def on_download(response):
8 print(response.body [:10])
9 global num
10 num -= 1
11 if not num: ioloop.stop ()
12
13 num = int(sys.argv [1])
14 ioloop = tornado.ioloop.IOLoop.instance ()
15 for i in range(num):
16 ioloop.add_callback(fetch)
17 ioloop.start ()
Про асинхронное сетевое программирование и Python, Стас Рудаков
Tornado: the results
1 $ time python gevent_example.py 5
2 <!DOCTYPE
3 <!DOCTYPE
4 <!DOCTYPE
5 <!DOCTYPE
6 <!DOCTYPE
7
8 real 0m0 .428s
9 user 0m0 .093s
10 sys 0m0 .023s
11
12 $ time python tornado_httpclient .py 1
13 <!DOCTYPE
14
15 real 0m0 .469s
16 user 0m0 .163s
17 sys 0m0 .027s
Про асинхронное сетевое программирование и Python, Стас Рудаков
PEP 3156
Asynchronous IO Support Rebooted
Про асинхронное сетевое программирование и Python, Стас Рудаков
PEP 3156: ключевые моменты
Разделение на транспорт и протокол — как в Twisted.
Future — объект обещания — подсмотрен в Java Futures.
API построено на yield from (до свидания, Python 2).
Event loop — один на поток.
Tulip — reference implementation.
Вероятно, Tulip войдет в Python 3.4 под каким-нибудь скучым именем (осень
2013).
Про асинхронное сетевое программирование и Python, Стас Рудаков
yield from на примере
1 #!/usr/bin/env python3
2
3 def a():
4 yield 1
5 yield 2
6 yield 3
7 return ’done_1 ’
8
9 def b():
10 done = yield from a()
11 print(done)
12 return ’done_b ’
13
14 for i in b():
15 print(i)
Listing 9: yield_from.py
$ python yield_from.py
1
2
3
done_1
Про асинхронное сетевое программирование и Python, Стас Рудаков
Tulip — reference implementation
1 #!/usr/bin/env python3
2 import sys
3 import tulip
4 import tulip.http
5
6 def curl(url):
7 response = yield from tulip.http.request(’GET’, url)
8 data = yield from response.read ()
9 print(data.decode(’utf -8’, ’replace ’)[:10])
10
11 if __name__ == ’__main__ ’:
12 loop = tulip.get_event_loop ()
13 loop. run_until_complete (curl(sys.argv [1]))
Про асинхронное сетевое программирование и Python, Стас Рудаков
“Эй ты, заканчивай там!”
Asynchronous networking — это правильный инструмент. . . для правильной
задачи.
Python настолько крутой, что допускает как минимум 3 возможных подхода
для написания асинхронных сетевых фрэймворков.
PEP 3156 выглядит многообещающе.
Про асинхронное сетевое программирование и Python, Стас Рудаков
“Эй ты, заканчивай там!”
Asynchronous networking — это правильный инструмент. . . для правильной
задачи.
Python настолько крутой, что допускает как минимум 3 возможных подхода
для написания асинхронных сетевых фрэймворков.
PEP 3156 выглядит многообещающе.
Стас, ты забыл рассказать про совместимость на уровне event loop’ов!
Про асинхронное сетевое программирование и Python, Стас Рудаков
СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ?
Стас Рудаков
mailto:stas@garage22.net
mailto:s_rudakou@wargaming.net
https://raw.github.com/nott/talks/master/async.pdf
http://twistedmatrix.com/
http://www.tornadoweb.org
http://www.gevent.org/
http://www.python.org/dev/peps/pep-3156/
https://code.google.com/p/tulip/

More Related Content

What's hot

"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
Badoo Development
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Ontico
 
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Ontico
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Ontico
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждение
Yehor Nazarkin
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
Elena Kotina
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Ontico
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Ontico
 

What's hot (19)

"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Вячеслав Бахмутов
Вячеслав БахмутовВячеслав Бахмутов
Вячеслав Бахмутов
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
 
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждение
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Зачем программистам Ansible
Зачем программистам AnsibleЗачем программистам Ansible
Зачем программистам Ansible
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 

Viewers also liked

Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 

Viewers also liked (20)

Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
Fabric для управления серверами
Fabric для управления серверамиFabric для управления серверами
Fabric для управления серверами
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкций
 
PythonGuI+PyQT
PythonGuI+PyQTPythonGuI+PyQT
PythonGuI+PyQT
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GIL
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
PyQGIS presentation.
PyQGIS  presentation.PyQGIS  presentation.
PyQGIS presentation.
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
Резюме
РезюмеРезюме
Резюме
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txt
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
 

Similar to Про асинхронное сетевое программирование

Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
Кирилл Борисов
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
it-people
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
Technopark
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)
Ontico
 

Similar to Про асинхронное сетевое программирование (20)

Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Сокеты
СокетыСокеты
Сокеты
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 

More from Python Meetup

S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
Python Meetup
 

More from Python Meetup (13)

Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Pebble
PebblePebble
Pebble
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшена
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory management
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 

Про асинхронное сетевое программирование

  • 2. Да что мы всё обо мне, да обо мне. . . Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 3. О чем будем говорить Что нам дает асинхронность Как это работает Twisted Gevent Tornado PEP 3156 https://raw.github.com/nott/talks/master/async.pdf Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 4. Работа с сетью: зачем что-то изобретать? 1 #!/usr/bin/env python2 2 import urllib2 3 f = urllib2.urlopen(’http :// python.org/’) 4 print f.read (10) Listing 1: urllib_example.py Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 5. Работа с сетью: зачем что-то изобретать? 1 #!/usr/bin/env python2 2 import urllib2 3 f = urllib2.urlopen(’http :// python.org/’) 4 print f.read (10) Listing 2: urllib_example.py 1 $ time python urllib_example.py 2 <!DOCTYPE 3 4 real 0m0 .384s 5 user 0m0 .067s 6 sys 0m0 .017s Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 6. Работа с сетью: зачем что-то изобретать? 1 #!/usr/bin/env python2 2 import urllib2 3 f = urllib2.urlopen(’http :// python.org/’) 4 print f.read (10) Listing 3: urllib_example.py 1 $ time python urllib_example.py 2 <!DOCTYPE 3 4 real 0m0 .384s 5 user 0m0 .067s 6 sys 0m0 .017s time Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 7. Работа с сетью: дальше будет только хуже 1 #!/usr/bin/env python2 2 import sys 3 import urllib2 4 for i in xrange (5): 5 f = urllib2.urlopen(’http :// python.org/’) 6 print f.read (10) , Listing 4: urllib_example2.py Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 8. Работа с сетью: дальше будет только хуже 1 #!/usr/bin/env python2 2 import sys 3 import urllib2 4 for i in xrange (5): 5 f = urllib2.urlopen(’http :// python.org/’) 6 print f.read (10) , Listing 5: urllib_example2.py 1 $ time python urllib_example2 .py 2 <!DOCTYPE <!DOCTYPE <!DOCTYPE 3 4 real 0m1 .007s 5 user 0m0 .050s 6 sys 0m0 .003s Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 9. Работа с сетью: дальше будет только хуже 1 #!/usr/bin/env python2 2 import sys 3 import urllib2 4 for i in xrange (5): 5 f = urllib2.urlopen(’http :// python.org/’) 6 print f.read (10) , Listing 6: urllib_example2.py 1 $ time python urllib_example2 .py 2 <!DOCTYPE <!DOCTYPE <!DOCTYPE 3 4 real 0m1 .007s 5 user 0m0 .050s 6 sys 0m0 .003s time/3 Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 10. I know, I’ll use. . . time Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 11. I know, I’ll use. . . time Some people, when confronted with a problem, think, "I know, I’ll use threads," and then two they hav erpoblesms. (Ned Batchelder) Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 12. I know, I’ll use. . . time Some people, when confronted with a problem, think, "I know, I’ll use threads," and then two they hav erpoblesms. (Ned Batchelder) time Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 13. Apache vs Nginx Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 14. Apache vs Nginx Apache time Nginx time Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 15. Лампочка Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 16. Event loop EVENT LOOP your code socket is ready wait for events (poll, epoll, etc.) Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 17. Event loop in GUI 1 def OnClose(self , event): 2 dlg = wx.MessageDialog(self , 3 "Do you really want to close this application?", 4 "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION) 5 result = dlg.ShowModal () 6 dlg.Destroy () 7 if result == wx.ID_OK: 8 self.Destroy () Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 18. Twisted Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 19. Twisted: transport vs protocol Транспорт знает, как пересылать байты примеры: socket, UNIX pipe, SSL socket, etc. Протокол знает, какие байты пересылать примеры: HTTP, SMTP, XMPP, Memcached, etc. Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 20. Twisted: transport vs protocol на примере 1 #!/usr/bin/env python2 2 from twisted.internet import reactor , protocol 3 class Counter(protocol.Protocol): 4 def __init__(self , factory): 5 self.factory = factory 6 def connectionMade (self): 7 num = self.factory.num = self.factory.num + 1 8 self.transport.write("open connections: %dn" % num) 9 def connectionLost (self , reason): 10 self.factory.num -= 1 11 dataReceived = lambda self , data: None 12 class CounterFactory(protocol.Factory): 13 def __init__(self): 14 self.num = 0 15 buildProtocol = lambda self , addr: Counter(self) 16 reactor.listenTCP (8123 , CounterFactory ()) 17 reactor.run() Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 21. Twisted: transport vs protocol 1 $ telnet 127.0.0.1 8123 2 Trying 127.0.0.1... 3 Connected to 127.0.0.1. 4 Escape character is ’^]’. 5 open connections: 2 Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 22. Twisted: Deferred Deferred — обещание вернуть результат. К нему прикрепляются callback’и и errback’и. Само использование Deferred еще не делает программу асинхронной. Важно, чтобы callback’и вызывались по событиям (в любых смыслах). Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 23. Twisted: Deferred на примере 1 #!/usr/bin/env python2 2 import sys 3 from twisted.internet import defer , reactor 4 from twisted.python.util import println 5 from twisted.web.client import getPage 6 7 results = [] 8 for i in xrange(int(sys.argv [1])): 9 d = getPage(’http :// www.python.org/’) 10 d.addCallback(lambda value: value [:10]) 11 d.addCallback(lambda value: println(value [:: -1])) 12 d.addErrback(lambda error: println("error:", error)) 13 results.append(d) 14 15 d_list = defer.DeferredList(results) 16 d_list.addBoth(lambda ignored: reactor.stop ()) 17 reactor.run() Listing 7: twisted_example.pyПро асинхронное сетевое программирование и Python, Стас Рудаков
  • 24. Twisted: Deferred 1 $ time python twisted_example.py 1 2 EPYTCOD!< 3 4 real 0m0 .833s 5 user 0m0 .250s 6 sys 0m0 .030s 7 $ time python twisted_example.py 5 8 EPYTCOD!< 9 EPYTCOD!< 10 EPYTCOD!< 11 EPYTCOD!< 12 EPYTCOD!< 13 14 real 0m1 .116s 15 user 0m0 .257s 16 sys 0m0 .043s Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 25. Twisted: параллельная вселенная последовательность синхронных операторов ≈ цепочка Deferred; вызов функции внутри функции ≈ возврат Deferred из Deferred; Deferred ≈ stack frame; блок try..except ≈ цепочка errback’ов; threading.join ≈ DeferredList; Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 26. Twisted: параллельная вселенная последовательность синхронных операторов ≈ цепочка Deferred; вызов функции внутри функции ≈ возврат Deferred из Deferred; Deferred ≈ stack frame; блок try..except ≈ цепочка errback’ов; threading.join ≈ DeferredList; logging; plugins; несовместимость с stdlib; отлично проработанная инфраструктура; достаточно (но далеко не самый) быстрый; Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 27. Gevent и прекрасный код Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 28. Gevent 1 #!/usr/bin/python2 2 import sys 3 from gevent import joinall , monkey , spawn 4 5 monkey.patch_all () 6 7 import urllib2 8 9 def fetch (): 10 f = urllib2.urlopen(’http :// www.python.org/’) 11 print f.read (10) 12 13 num = int(sys.argv [1]) 14 # equivalent can be also implemented with threading 15 joinall ([ spawn(fetch) for i in xrange(num)]) Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 29. Gevent: oh wow! 1 $ time python gevent_example.py 1 2 <!DOCTYPE 3 4 real 0m0 .434s 5 user 0m0 .077s 6 sys 0m0 .020s 7 8 $ time python gevent_example.py 5 9 <!DOCTYPE 10 <!DOCTYPE 11 <!DOCTYPE 12 <!DOCTYPE 13 <!DOCTYPE 14 15 real 0m0 .428s 16 user 0m0 .093s 17 sys 0m0 .023s Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 30. Greenlets inside 1 #!/usr/bin/env python 2 from greenlet import greenlet 3 4 def test1 (): 5 print (1) 6 gr2.switch () 7 print (3) 8 def test2 (): 9 print (2) 10 gr1.switch () 11 print (4) 12 13 gr1 = greenlet(test1) 14 gr2 = greenlet(test2) 15 gr1.switch () Listing 8: greenlet_example.py $ python greenlet_example .py 1 2 3 Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 31. Gevent: есть нюанс Текущая версия 0.13. В версии 1.0 запланирован переход с libevent на libev. Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 32. Gevent: есть нюанс Текущая версия 0.13. В версии 1.0 запланирован переход с libevent на libev. Первая β-версия для 1.0 была выпущена около 2 лет назад. Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 33. Gevent: есть нюанс Текущая версия 0.13. В версии 1.0 запланирован переход с libevent на libev. Первая β-версия для 1.0 была выпущена около 2 лет назад. Пугают страшилки про гринлеты. Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 34. Gevent: есть нюанс Текущая версия 0.13. В версии 1.0 запланирован переход с libevent на libev. Первая β-версия для 1.0 была выпущена около 2 лет назад. Пугают страшилки про гринлеты. Проблемы с совместимостью с существующими библиотеками. Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 35. Tornado и быстрые HTTP серверы Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 36. Tornado 1 #!/usr/bin/env python 2 import tornado.ioloop 3 import tornado.httpclient 4 import tornado.web 5 6 class Handler(tornado.web.RequestHandler): 7 @tornado.web.asynchronous 8 def get(self , path): 9 http = tornado.httpclient. AsyncHTTPClient () 10 http.fetch("http :// www.python.org/" + path , 11 self._on_download) 12 def _on_download(self , response): 13 self.write(response.body) 14 self.finish () 15 application = tornado.web.Application ([(r"/(.*)", Handler) ,]) 16 application.listen (8888) 17 tornado.ioloop.IOLoop.instance ().start () Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 37. Tornado: we need an HTTP client! 1 #!/usr/bin/env python 2 import sys , tornado.ioloop , tornado.httpclient 3 4 def fetch (): 5 http = tornado.httpclient. AsyncHTTPClient () 6 http.fetch("http :// www.python.org/", on_download) 7 def on_download(response): 8 print(response.body [:10]) 9 global num 10 num -= 1 11 if not num: ioloop.stop () 12 13 num = int(sys.argv [1]) 14 ioloop = tornado.ioloop.IOLoop.instance () 15 for i in range(num): 16 ioloop.add_callback(fetch) 17 ioloop.start () Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 38. Tornado: the results 1 $ time python gevent_example.py 5 2 <!DOCTYPE 3 <!DOCTYPE 4 <!DOCTYPE 5 <!DOCTYPE 6 <!DOCTYPE 7 8 real 0m0 .428s 9 user 0m0 .093s 10 sys 0m0 .023s 11 12 $ time python tornado_httpclient .py 1 13 <!DOCTYPE 14 15 real 0m0 .469s 16 user 0m0 .163s 17 sys 0m0 .027s Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 39. PEP 3156 Asynchronous IO Support Rebooted Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 40. PEP 3156: ключевые моменты Разделение на транспорт и протокол — как в Twisted. Future — объект обещания — подсмотрен в Java Futures. API построено на yield from (до свидания, Python 2). Event loop — один на поток. Tulip — reference implementation. Вероятно, Tulip войдет в Python 3.4 под каким-нибудь скучым именем (осень 2013). Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 41. yield from на примере 1 #!/usr/bin/env python3 2 3 def a(): 4 yield 1 5 yield 2 6 yield 3 7 return ’done_1 ’ 8 9 def b(): 10 done = yield from a() 11 print(done) 12 return ’done_b ’ 13 14 for i in b(): 15 print(i) Listing 9: yield_from.py $ python yield_from.py 1 2 3 done_1 Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 42. Tulip — reference implementation 1 #!/usr/bin/env python3 2 import sys 3 import tulip 4 import tulip.http 5 6 def curl(url): 7 response = yield from tulip.http.request(’GET’, url) 8 data = yield from response.read () 9 print(data.decode(’utf -8’, ’replace ’)[:10]) 10 11 if __name__ == ’__main__ ’: 12 loop = tulip.get_event_loop () 13 loop. run_until_complete (curl(sys.argv [1])) Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 43. “Эй ты, заканчивай там!” Asynchronous networking — это правильный инструмент. . . для правильной задачи. Python настолько крутой, что допускает как минимум 3 возможных подхода для написания асинхронных сетевых фрэймворков. PEP 3156 выглядит многообещающе. Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 44. “Эй ты, заканчивай там!” Asynchronous networking — это правильный инструмент. . . для правильной задачи. Python настолько крутой, что допускает как минимум 3 возможных подхода для написания асинхронных сетевых фрэймворков. PEP 3156 выглядит многообещающе. Стас, ты забыл рассказать про совместимость на уровне event loop’ов! Про асинхронное сетевое программирование и Python, Стас Рудаков
  • 45. СПАСИБО ЗА ВНИМАНИЕ. ВОПРОСЫ? Стас Рудаков mailto:stas@garage22.net mailto:s_rudakou@wargaming.net https://raw.github.com/nott/talks/master/async.pdf http://twistedmatrix.com/ http://www.tornadoweb.org http://www.gevent.org/ http://www.python.org/dev/peps/pep-3156/ https://code.google.com/p/tulip/