SlideShare a Scribd company logo
搜狐邮箱的Python经验	

彭 一	

	

ryanpoy@gmail.com	

今天的话题	

•  优雅的发布Python项目	

•  优秀的WEB框架-Tornado	

•  加速你的Python代码	

•  简化你的C代码	

优雅的发布Python项目	

抓狂的现象	

•  第3方依赖多,下载速度慢	

•  内网服务器不能连外网	

•  老版本不再提供下载	

•  GFW	

	

pypiserver	

—  是用来搭建本地python package的工具	

—  优点	

—  轻量简单,易安装	

https://pypi.python.org/packages/source/p/pypiserver/pypiserver-1.1.0.zip	

—  方便使用	

gunicorn -w4 -b0.0.0.0:8080 ‘pypiserver:app(“/var/www/pypidir”)’ –D	

—  package方便管理	

pip install –no-install Django –d /var/www/pypydir	

pypiserver	

fabric	

—  一个用python实现的,用于项目的推送的工具,类似于
ruby中的capistrano	

—  优点	

—  加强版SSH	

—  支持本地和远程操作	

—  参数灵活	

—  完整的日志输出	

fabric-example	

—  fabfile.py	

—  demo.py	

fabric-example	

—  执行	

—  更多漂亮的推送脚本	

—  fab Project.production git.tar:v1.1 common.deploy	

—  fab Project.production common.rollback	

—  fab Project.production common.health:ProjectName	

—  ……	

优秀的WEB框架-Tornado	

代码简单	

from web import application	

class Index:	

def GET(self):᠋᠌᠍᠎
return 'Hello, GET ! n’	

def POST(self):᠋᠌᠍᠎
return 'Hello, POST ! n’	

urls = ( '/', 'Index’ )	

if __name__ == '__main__’:᠋᠌᠍᠎
app = application(urls, globals())᠋᠌᠍᠎
app.run()	

import tornado.ioloop᠋᠌᠍᠎
from tornado.web import RequestHandler ᠋᠌᠍᠎
from tornado.web import Application	

class Index(RequestHandler):	

def get(self):᠋᠌᠍᠎
self.write('Hello, GET ! n’)	

def post(self):᠋᠌᠍᠎
self.write('Hello, POST! n’)	

urls = ( ('/', Index), )	

if __name__ == '__main__’:᠋᠌᠍᠎
app = Application(urls).listen(8000)᠋᠌᠍᠎
tornado.ioloop.IOLoop.instance().start()	

性能优秀	

—  硬件配置: 2*CPU 8G Mem 100GDisk	

—  2k并发,5w访问	

	
 部署	

	

QPS	
 Success	

2*Nginx + 4*Tornado	
 4402	
 100%	

2*Nginx + flup + 4*Django	
 4207	
 88%	

2*Nginx + flup + 4*webpy	
 无法响应	

成熟	

—  v3.0	

—  案例	

—  http://friendfeed.com	

—  http://www.zhihu.com	

RequestHandler生命周期	

initalize(self, **kwargs)	
 prepare(self)	

write_error(self, status_code, **kwargs)	
finish(self, chunk=None)	

get/post/put …	

异步请求	

import tornado.web as web	

class AsyncHandler(RequestHandler):	

@web.asynchronous᠋᠌᠍᠎
def get(self):᠋᠌᠍᠎
᠋᠌᠍᠎
url = 'http://example.com'᠋᠌᠍᠎
᠋᠌᠍᠎
hc = AsyncHTTPClient()᠋᠌᠍᠎
᠋᠌᠍᠎
hc.fetch(url, callback=self.on_fetch)᠋᠌᠍᠎
᠋᠌᠍᠎
᠋᠌᠍᠎
def on_fetch(self, response):	

do_something_with (response)	

self.render('template.html')	

import tornado.web as web ᠋᠌᠍᠎
import tornado.gen as gen	

class GenAsyncHandler(RequestHandler):	

@web.asynchronous᠋᠌᠍᠎
@gen.engine᠋᠌᠍᠎
def get(self):	

url = 'http://example.com'	

hc = AsyncHTTPClient()	

response = yield hc.fetch(url)	

do_something_with (response)	

self.render('template.html')	

Connection	

—  基于MySQLdb封装	

—  使用技巧	

—  全局	

db = Connection(host = 'localhost:3306', database =
'centerdata', user = 'root', password = '')	

—  防止 mysql server gone away	

ping_db = lambda: db.query('show variables’)	

tornado.ioloop.PeriodicCallback(ping_db, 600 * 1000).start()	

Tornado+Django	

Tornado的高性能	

Django的ORM	

Django的Admin	

创建项目结构	

—  django-admin.py startproject
Demo	

—  cd Demo	

—  python manage.py startapp
app	

—  touch application.py	

—  mv app/views.py app/
controllers.py	

修改settings.py	

	

修改urls.py	

	

修改application.py	

	

事务处理	

利用django的TransactionMiddleware	

	

	

	

自动事务处理	

class BaseController(object):	

def prepare(self):᠋᠌᠍᠎
pass	

	

def write_error(self, status_code, **kwargs):᠋᠌᠍᠎
pass	

	

᠋᠌᠍᠎
def finish (self, chunk=None):᠋᠌᠍᠎
pass 	

	

	

一些思考	

—  数据库是否要异步?	

—  有耗时长的同步操作?	

—  存在大文件上传?	

	

	

加速你的Python	

例子-Python	

	

	

例子-纯C	

	

	

swig	

—  example.h	

—  example.c	

	

	

swig	

—  example.i	

—  编译	

—  swig –python example.i # 生成example.py 和 example_wrap.c	

—  gcc example.c example_wrap.c –fPIC -I/usr/include/python2.7/	

-shared -o _example.so # 生成so文件,注意一定要下划线开始	

—  执行	

	

	

ctypes	

—  pointer.c	

	

—  编译成so	

—  python调so	

	

	

简化你的C代码	

应用场景	

—  修改一个第3方的C库	

—  业务复杂的C代码	

—  业务功能、程序稳定 为主要要求	

—  性能可以有所损耗	

C调用Python步骤	

	

	

初始Python环境	
 导入Python模块	

获取方法	
设置方法参数	

调用方法	
 释放Python环境	

例子-demo.py	

def deliver(ip, sender, receiver, data):	

''' ip,sender 是否有效,是否在黑名单;	

recevier 是否有效,是否设置转发,	

是否自动回复;	

data 是否有违禁内容	

… 其它复杂的业务逻辑	

'''	

# 非常复杂的业务逻辑实现代码	

例子-C代码	

	

	

其它用法	

—  NULL写成Py_None	

—  Py_DECREF 和 Py_XDECREF	

PyObject* p = Py_None; if (p) Py_DECREF(p) ó Py_XDECREF(p)	

—  设置tuple类型的参数	

PyObject* py_tuple = PyTuple_New(size)	

PyTuple_SetItem(py_tuple, idx, v)	

—  设置dict类型的参数	

PyObject* py_dict = PyDict_New()	

PyDict_SetItem(py_dict, k, v) 	

	

	

回顾	

•  优雅的发布Python项目	

•  pypiserver	

•  fabric	

•  优秀的WEB框架-Tornado	

•  基本用法	

•  与Django相结合	

•  加速你的Python代码	

•  swig	

•  ctypes	

•  简化你的C代码	

谢谢	


More Related Content

PDF
Node予備校 vol.1 名古屋
PDF
AngularFireで楽々バックエンド
PPTX
イベント駆動プログラミングとI/O多重化
PDF
今からでも大丈夫!Firebase入門
PDF
Grafana Dashboards as Code
PDF
20150101勉強会 dokku alt
PPTX
JavaScriptから利用するFirebase
PDF
Openresty
Node予備校 vol.1 名古屋
AngularFireで楽々バックエンド
イベント駆動プログラミングとI/O多重化
今からでも大丈夫!Firebase入門
Grafana Dashboards as Code
20150101勉強会 dokku alt
JavaScriptから利用するFirebase
Openresty

What's hot (20)

PDF
Ingress on GKE/GCE
PDF
静的サイトどこにする?
PDF
Nuxt.js + microCMS + netlify
PDF
AWS SDK for Smalltalk
PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
Docker+CoreOS+GCEで自動スケール分散レイトレ
PDF
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
PDF
Neo4jでつなぐ知見のネットワーク [Pycon2016 LT]
PDF
Apache Drill で見る Twitter の世界
PDF
2日間Fabricを触った俺が
 色々解説してみる
PDF
Fabric
KEY
Web Operations and Perl kansai.pm#14
PDF
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
PPTX
Gocon2017:Goのロギング周りの考察
PDF
Kibanaでsysstatを可視化する
PDF
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
PDF
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
PDF
Stream processing and Norikra
KEY
Fabricでサーバー管理をDRYにしよう
PDF
nginx入門
Ingress on GKE/GCE
静的サイトどこにする?
Nuxt.js + microCMS + netlify
AWS SDK for Smalltalk
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
Docker+CoreOS+GCEで自動スケール分散レイトレ
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Neo4jでつなぐ知見のネットワーク [Pycon2016 LT]
Apache Drill で見る Twitter の世界
2日間Fabricを触った俺が
 色々解説してみる
Fabric
Web Operations and Perl kansai.pm#14
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Gocon2017:Goのロギング周りの考察
Kibanaでsysstatを可視化する
Kubernetes で実践するクラウドネイティブ DevOps "監視とオブザーバビリティ"編 / Cloud Native DevOps with K...
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Stream processing and Norikra
Fabricでサーバー管理をDRYにしよう
nginx入門
Ad

Viewers also liked (6)

PDF
Marie Florestal
PPT
Quality Systems Investigations
PPTX
Body Vana Community
PDF
Upgrading Share Point Portal Server 2003 Customizations To Share Point Server...
PDF
Michael Lyons-Johnston Portfolio
PDF
Yatin Patel
Marie Florestal
Quality Systems Investigations
Body Vana Community
Upgrading Share Point Portal Server 2003 Customizations To Share Point Server...
Michael Lyons-Johnston Portfolio
Yatin Patel
Ad

Sohu邮箱的python经验