PyCon2014China-Zhuhai-jeff

6002ee051e03f0b762642ee7fafd111f?s=47 Zoom.Quiet
November 17, 2014

 PyCon2014China-Zhuhai-jeff

6002ee051e03f0b762642ee7fafd111f?s=128

Zoom.Quiet

November 17, 2014
Tweet

Transcript

  1. None
  2. 万万没想到之: Python Web异步编程记 jeff@toraysoft.com

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

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

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

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

  7. 举个栗⼦子开始 = / A ? / 0 0 / 2

    听题:写⼀一个搜索歌曲的接⼝口
  8. Django ⼀一下 uwsgi --http :8000 --module pyconf2014.wsgi --processes 1

  9. ab之 500秒!

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

  11. 再ab之 50秒!

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

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

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

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

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

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

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

  19. Tornado

  20. 作为Server python run_tornado.py

  21. ab⼀一下 5秒!

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

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

  24. 可惜 • 回调模型⽆无爱 • yield伪同步模式⼊入侵性太强 (第三⽅方sdk要重新实 现) • server与框架耦合度太⾼高,⼊入侵性太强+1, 不能使⽤用

    熟悉的框架作业。 • 作为wsgi server,未能发挥其优势
  25. Gevent! • Greenlet • libEvent • monkey_patch()!

  26. 认识Gevent

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

  28. Gevent + wsgi • uWsgi

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

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

  31. 再ab⼀一下 5秒!

  32. 但,uWsgi + Django的泪 • uWsgi的对thread的patch有问题 • 如果django的view有访问数据库,则数据库连接⾮非 线程(协程)安全。 • databasewrapper

    objects created in a thread can only be used in that same thread。
  33. Gunicron + Django • Gunicron,patch完美 • 但,使⽤用Django数据库连接池需谨慎!⾼高并发导致 占⽤用⼤大量的数据库连接。

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

  35. 谢谢