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

PyCon2014China-Zhuhai-jeff

Zoom.Quiet
November 17, 2014

 PyCon2014China-Zhuhai-jeff

Zoom.Quiet

November 17, 2014
Tweet

More Decks by Zoom.Quiet

Other Decks in Technology

Transcript

  1. View Slide

  2. 万万没想到之:
    Python Web异步编程记
    [email protected]

    View Slide

  3. 本栏⺫⽬目由“珠三⾓角技术沙⻰龙”赞助播出
    蕉爷,你姓蕉吗? Yeah!爷姓蕉!

    View Slide

  4. 本栏⺫⽬目由“⾳音乐说”赞助播出
    觉得我好听就闪聊⼀一下呗

    View Slide

  5. 本栏⺫⽬目由“萌叔漫玩”赞助播出
    ⼩小妹妹,你看⼤大叔萌萌哒,有⽊木有

    View Slide

  6. @jeff_kit
    @姐夫
    前珠三⾓角技术沙⻰龙⾸首席组委
    Toraysoft co-founder
    Toraysoft ⾸首席码农

    View Slide

  7. 举个栗⼦子开始
    = / A ?
    / 0 0
    / 2
    听题:写⼀一个搜索歌曲的接⼝口

    View Slide

  8. Django ⼀一下
    uwsgi --http :8000 --module pyconf2014.wsgi --processes 1

    View Slide

  9. ab之
    500秒!

    View Slide

  10. 改进#1
    uwsgi --http :8000 --module pyconf2014.wsgi --processes 10

    View Slide

  11. 再ab之
    50秒!

    View Slide

  12. 嗯!启动100条进程就
    可以了!

    View Slide

  13. 问题在哪?
    • 同步⺴⽹网络请求耗时⻓长,前⾯面的请求导致后续的请求阻
    塞。
    • 最⼤大进程数就是最⼤大并发数。
    • 消耗巨⼤大的服务器资源。
    • 请求队列爆掉,如同被DDOS!

    View Slide

  14. 异步解决⽅方案
    • ⾮非阻塞IO + 异步调度
    • select,epoll,kqueue

    View Slide

  15. 说⼈人话
    • web服务器请求第三⽅方服务的时候,交出控制权,返
    回去受理新的⽤用户请求。
    • 第三⽅方服务有返回的时候,通知web服务器进程,把
    结果返回给⽤用户。

    View Slide

  16. ? / I
    A= K
    / 0 02
    / 0 02 A= K

    View Slide

  17. 异步web框架哪家强?
    • 没有异步web框架,wsgi是同步标准。
    • 那是web server的事⼉儿。

    View Slide

  18. 异步webserver哪家强?
    • twisted,超重量级。略。
    • Tornado,既是server,也是framework。
    • Gevent兼容的uwsgi Contailer,uWsgi,Gunicron。

    View Slide

  19. Tornado

    View Slide

  20. 作为Server
    python run_tornado.py

    View Slide

  21. ab⼀一下
    5秒!

    View Slide

  22. 回调?⽆无爱!耶!yield!

    View Slide

  23. 优点
    • 单线程,⾼高并发
    • 低能耗,⾼高效率

    View Slide

  24. 可惜
    • 回调模型⽆无爱
    • yield伪同步模式⼊入侵性太强 (第三⽅方sdk要重新实
    现)
    • server与框架耦合度太⾼高,⼊入侵性太强+1, 不能使⽤用
    熟悉的框架作业。
    • 作为wsgi server,未能发挥其优势

    View Slide

  25. Gevent!
    • Greenlet
    • libEvent
    • monkey_patch()!

    View Slide

  26. 认识Gevent

    View Slide

  27. Gevent能
    • 让你按原来的⽅方式写代码。
    • 让同步编写的代码,异步地执⾏行。
    • 让单线程也并发,且⽐比多线程更⾼高效环保。
    • 让原⽣生的thread变成green thread。

    View Slide

  28. Gevent + wsgi
    • uWsgi

    View Slide

  29. uWsgi
    • 修改处理器的类型即可 processes => gevent
    • patch all:— gevent-monkey-patch

    View Slide

  30. 代码,还是原来的味
    uwsgi --http :8000 --module pyconf2014.wsgi
    --gevent 100 --gevent-monkey-patch

    View Slide

  31. 再ab⼀一下
    5秒!

    View Slide

  32. 但,uWsgi + Django的泪
    • uWsgi的对thread的patch有问题
    • 如果django的view有访问数据库,则数据库连接⾮非
    线程(协程)安全。
    • databasewrapper objects created in a thread can
    only be used in that same thread。

    View Slide

  33. Gunicron + Django
    • Gunicron,patch完美
    • 但,使⽤用Django数据库连接池需谨慎!⾼高并发导致
    占⽤用⼤大量的数据库连接。

    View Slide

  34. 万万没想到
    python web异步化,配个参数就完了

    View Slide

  35. 谢谢

    View Slide