Python 于 webgame 的应用

勇浩 赖
勇浩 赖Game Developer at Yinhan Co., Ltd.
Python 于 web-game 的应用

 赖勇浩(http://laiyonghao.com)
       2011.12.04


                              1
自我介绍
• 网游从业超过 6 年              • 天下盛境
• 曾在网易、江苏盛典                –   团队建设
                           –   项目管理
  (广州)等公司工作
                           –   服务器端
• 珠三角技术沙龙                  –   通信与安全
• 赖勇浩的编程私伙局               • 斩魂
  – pv 1,000,000+          – 服务器端
  – csdn blog top100       – AI
• twitter/weibo/42qu/CP   • 幻想三国、疯狂石头
  yUG/gzlug                 和泡泡游戏等

                                        2
启发于……




http://slidesha.re/aGrXfY   http://slidesha.re/fQhtkL

                                                        3
以我经历的项目为蓝本,向大家讲述
 web-game 服务器端技术与工具



    源于项目,高于项目。

                      4
项目介绍1
• 天下盛境
  – 横版卷轴
  – 动作类网页游戏
• 0505u.com
• 服务器端完全使
  用 Python 开发
• 2010.08~现在
                  5
项目介绍2




• 棋牌OnWeb
   – QQgame copy cat
• http://qp-demo.laiyonghao.com/client/
• 服务器端完全使用 Python 开发
• 2009.01~2009.03
                                          6
library




          7
Python 在 Python 项目中的位置



   C/C++         Python
           lua            C/C++



           lua            Python




                                   8
大中型 Python 项目




                9
大中型 Python 项目




                10
大中型 Python 项目




                11
lib 应该在 Lib/site-packages 目录




                               12
要整这么复杂吗?




           13
就一个 setup.py 而已……



        • 避免手写 setup.py
        • 如何建立命名空间包




                          14
神器 paster
     • http://pypi.python.org/
       pypi/PasteScript
     • 创建、安装、测试、
       部署、运行
     • Many different kinds
       of projects have
       created skeletons for
       their projects (Pylons,
       TurboGears,
       ZopeSkel, and others).
     • http://pypi.python.org/
       pypi/PasteDeploy
                            15
基本用法




       16
pbp.skels
• http://pypi.python.org/pypi/pbp.skels
• pbp.skels is a collection of templates to
  speed up the creation of standardized,
  boiler-plate code.




                                              17
• paster create -t pbp_package my.package




                                            18
http://lucasmanual.com/mywiki/PythonPaste


  编写自己的 templates, commands




                                            19
开发、测试、打包、更新
•   python setup.py develop
•   python setup.py test
•   python setup.py bdist
•   python setup.py sdist --formats=gztar,zip
•   python setup.py register
•   python setup.py upload


                                                20
virtualenv
• http://pypi.python.org/pypi/virtualenv
• Virtual Python Environment builder
• 《Python于Web 2.0网站的应用》介绍过了




                                       21
plugin




         22
what is the difference between
         plugin and library?
• A plugin extends the capabilities of a
  larger application.
• A library is a collection of subroutines or
  classes used to develop software.

• http://stackoverflow.com/a/2792342



                                                23
以《棋牌OnWeb》为例……




                 24
到后台看看……




          25
神器 setuptools




                26
setup.py
entry_points="""
# -*- Entry points: -*-
[qipaionweb.games]
doudizhu = doudizhu.game_impl:GameImpl
"""




                                         27
def get_game_impl_class(game_name):
  group = 'qipaionweb.games'
  prj = game_name
  return pkg_resources.load_entry_point(
      prj,
      group,
      game_name)


                                           28
接口与实现
• game_interface   • game_impl
  – 与房间进程交互         – 实现接口
  – 通用功能(踢人)        – 实现业务逻辑
  – 计时器管理           – 不接触网络
  – 定义接口            – 不接触数据库
                    – 单线程


                                 29
进阶:Trac Component Architecture

•    trac.core.ComponentManager
•    trac.core.Component
•    trac.core.ExtensionPoint
•    trac.core.Interface




    http://trac.edgewall.org/wiki/TracDev/ComponentArchitecture
    http://trac.edgewall.org/wiki/TracDev/PluginDevelopment
                                                                  30
参考:ulipad
• http://code.google.com/p/ulipad/source/bro
  wse/trunk/modules/Mixin.py
• 另一种 plugin 机制




                                           31
I/O




      32
I/O needs to be done differently.




                                    33
I/O needs to be done differently.




                                    34
35
http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf
                                                               36
This is how I/O should be done.
def sign_in(username, password):
  result = db.query('select ...')
  if len(result) == 1:
       token = game.sign_in(...)
       return token               2            DB
                       1
                                       3

                       6     sign_in       4

                                       5
                                           game
                             7                      37
协程才是未来!




          38
gevent




         39
gevent = libevent + greenlet




                               40
libevent
• 提供指定文件描述符事件发生时调用
  回调函数的机制
• timeouts, signals




                      41
greenlet
• green thread
  – user space
  – pseudo-concurrently
  – scheduled by VM
  – http://wikipedia.org/wiki/Green_threads
• greenlet = python's green thread


                                              42
echo server
•   from gevent.server import                   •   if __name__ == '__main__':
    StreamServer                                •       server =
•   def echo(socket, address):                      StreamServer(('0.0.0.0', 6000),
                                                    echo)
•      fileobj = socket.makefile()
                                                •       print ('Starting echo server
•      while True:                                  on port 6000')
•          line = fileobj.readline()            •       server.serve_forever()
•          if not line:
•              break
•          if line.strip().lower() == 'quit':
•              print ("client quit")
•              break
•          fileobj.write(line)
•          fileobj.flush()

                                                                                  43
参考:eurasia
• http://code.google.com/p/eurasia/




                                      44
protocol




           45
google protobuf
• http://code.google.com/p/protobuf/
• 协议描述语言
• C++、java、Python and more




                                       46
RPC




      47
abu.RPC = gevent + protobuf




                              48
abu.RPC
•   更小(得益于 google protobuf)
•   更快(得益于 libevent)
•   同步API(利益于 greenlet)
•   并行管线
•   双向调用

                              49
并行管线




http://wiki.msgpack.org/display/MSGPACK/Design+of+RPC
                                                        50
echo server
from abu.rpc import Server, send_return
import echo_pb2 as echo
class EchoService(echo.EchoService):
   @send_return
   def echo(self, controller, request, done):
      return request
server = Server(('0.0.0.0', 1008),(EchoService(),))
print 'serving...'
server.serve_forever()

                                                      51
publish-subscribe




                    52
import message                • hello, lai.
def hello(context, name):
 print 'hello, %s.'%name
message.sub('greet', hello)
message.pub('greet', 'lai')




                                              53
python-message
• http://pypi.python.org/pypi/message
• 进程内的 publish-subscribe 机制
• 受 falcon 编程语言启发而写
• http://www.slideshare.net/laiyonghao/pyth
  onmessage010
• 应用于任务、邮件、好友等子系统


                                              54
utils




        55
absolute32
•   http://pypi.python.org/pypi/absolute32
•   [-2**31, 2**31-1]
•   ubuntu 10.04 LTS 32-bit/64-bit
•   python 2.6/3.1
•      hash
•      add
•      crc
•      adler
                                             56
谢谢。
  Q&A


http://laiyonghao.com


                        57
1 of 57

Recommended

论 Python 与设计模式。 by
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
1.9K views36 slides
页游开发中的 Python 组件与模式 by
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
2.1K views55 slides
合久必分,分久必合 by
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
5.2K views55 slides
深入淺出 Web 容器 - Tomcat 原始碼分析 by
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
3.8K views52 slides
用Cython封装c++代码为python模块的一点经验 by
用Cython封装c++代码为python模块的一点经验用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验Leo Zhou
506 views23 slides
Wind.js无障碍调试与排错 by
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错jeffz
2K views43 slides

More Related Content

What's hot

Node way by
Node wayNode way
Node wayEthan Zhang
4.5K views42 slides
Python 入门 by
Python 入门Python 入门
Python 入门kuco945
855 views26 slides
OpenEJB - 另一個選擇 by
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
1.8K views49 slides
Py ladies 0928 by
Py ladies 0928Py ladies 0928
Py ladies 0928Chia-Yi Yen
1.3K views51 slides
HITCON CTF 2014 BambooFox 解題心得分享 by
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享Chong-Kuan Chen
7.8K views48 slides
180518 ntut js and node by
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
122 views58 slides

What's hot(18)

Python 入门 by kuco945
Python 入门Python 入门
Python 入门
kuco945855 views
OpenEJB - 另一個選擇 by Justin Lin
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Justin Lin1.8K views
Py ladies 0928 by Chia-Yi Yen
Py ladies 0928Py ladies 0928
Py ladies 0928
Chia-Yi Yen1.3K views
HITCON CTF 2014 BambooFox 解題心得分享 by Chong-Kuan Chen
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen7.8K views
180518 ntut js and node by Peter Yi
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
Peter Yi122 views
ios分享 by Lucien Li
ios分享ios分享
ios分享
Lucien Li718 views
基于原型的JavaScript面向对象编程 by zhangdaiping
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
zhangdaiping2.4K views
iPhone,ios,Object-C基础入门 by Lucien Li
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
Lucien Li863 views
Jscex:案例、经验、阻碍、展望 by jeffz
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
jeffz1.9K views
Jscex:案例、阻碍、体会、展望 by jeffz
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
jeffz2.2K views
Advanced heap exploitaion by Angel Boy
Advanced heap exploitaionAdvanced heap exploitaion
Advanced heap exploitaion
Angel Boy27.1K views
Node.js开发体验 by QLeelulu
Node.js开发体验Node.js开发体验
Node.js开发体验
QLeelulu1.9K views
Shell,信号量以及java进程的退出 by wang hongjiang
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
wang hongjiang2.5K views
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹 by Johnny Sung
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Johnny Sung988 views
Ooredis by iammutex
OoredisOoredis
Ooredis
iammutex979 views
jQuery源码学习 by fangdeng
jQuery源码学习jQuery源码学习
jQuery源码学习
fangdeng436 views

Similar to Python 于 webgame 的应用

DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代 by
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
594 views42 slides
[3]投影片 futurewad樹莓派研習會 141204 by
[3]投影片 futurewad樹莓派研習會 141204[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204CAVEDU Education
810 views40 slides
Linux binary Exploitation - Basic knowledge by
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
3K views105 slides
Binary exploitation - AIS3 by
Binary exploitation - AIS3Binary exploitation - AIS3
Binary exploitation - AIS3Angel Boy
7.3K views235 slides
⼤語⾔模型 LLM 應⽤開發入⾨ by
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
5.4K views94 slides
該怎麼樣(認真的)部署你的 Python Web 應用程式? by
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?Andy Dai
1.9K views29 slides

Similar to Python 于 webgame 的应用(20)

DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代 by scott liao
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
scott liao594 views
[3]投影片 futurewad樹莓派研習會 141204 by CAVEDU Education
[3]投影片 futurewad樹莓派研習會 141204[3]投影片 futurewad樹莓派研習會 141204
[3]投影片 futurewad樹莓派研習會 141204
CAVEDU Education810 views
Linux binary Exploitation - Basic knowledge by Angel Boy
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
Angel Boy3K views
Binary exploitation - AIS3 by Angel Boy
Binary exploitation - AIS3Binary exploitation - AIS3
Binary exploitation - AIS3
Angel Boy7.3K views
⼤語⾔模型 LLM 應⽤開發入⾨ by Wen-Tien Chang
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
Wen-Tien Chang5.4K views
該怎麼樣(認真的)部署你的 Python Web 應用程式? by Andy Dai
該怎麼樣(認真的)部署你的 Python Web 應用程式?該怎麼樣(認真的)部署你的 Python Web 應用程式?
該怎麼樣(認真的)部署你的 Python Web 應用程式?
Andy Dai1.9K views
Django step0 by 永昇 陳
Django step0Django step0
Django step0
永昇 陳819 views
Continuous Delivery Workshop with Ansible x GitLab CI (3rd) by Chu-Siang Lai
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Chu-Siang Lai341 views
Docker 基礎介紹與實戰 by Bo-Yi Wu
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰
Bo-Yi Wu15.8K views
基于 FRIDA 的全平台逆向分析 by CC
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
CC 15.3K views
用Raspberry PI學Linux驅動程式 by Stanley Ho
用Raspberry PI學Linux驅動程式用Raspberry PI學Linux驅動程式
用Raspberry PI學Linux驅動程式
Stanley Ho589 views
[students AI workshop] Pytorch by Tzu-Wei Huang
[students AI workshop]  Pytorch[students AI workshop]  Pytorch
[students AI workshop] Pytorch
Tzu-Wei Huang315 views
Software Engineer Talk by Larry Cai
Software Engineer TalkSoftware Engineer Talk
Software Engineer Talk
Larry Cai1K views
D2_node在淘宝的应用实践_pdf版 by Jackson Tian
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
Jackson Tian3K views
Node.js在淘宝的应用实践 by taobao.com
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
taobao.com2.6K views
02.python.开发最佳实践 by Na Lee
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
Na Lee895 views
构建ActionScript游戏服务器,支持超过15000并发连接 by Renaun Erickson
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
Renaun Erickson858 views
模块一-Go语言特性.pdf by czzz1
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
czzz123 views
LINE Messaging API with LinkIt 7697 by CAVEDU Education
LINE Messaging API with LinkIt 7697 LINE Messaging API with LinkIt 7697
LINE Messaging API with LinkIt 7697
CAVEDU Education6.6K views

More from 勇浩 赖

一种多屏时代的通用 web 应用架构 by
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构勇浩 赖
3.7K views35 slides
Tp web by
Tp webTp web
Tp web勇浩 赖
1.1K views35 slides
2012,我的技术之选 by
2012,我的技术之选2012,我的技术之选
2012,我的技术之选勇浩 赖
2.2K views26 slides
Scala by
ScalaScala
Scala勇浩 赖
1.5K views74 slides
珠三角技术沙龙广州场 by
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场勇浩 赖
1.3K views12 slides
为什么 rust-lang 吸引我? by
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?勇浩 赖
2.7K views32 slides

More from 勇浩 赖(20)

一种多屏时代的通用 web 应用架构 by 勇浩 赖
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
勇浩 赖3.7K views
2012,我的技术之选 by 勇浩 赖
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
勇浩 赖2.2K views
珠三角技术沙龙广州场 by 勇浩 赖
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场
勇浩 赖1.3K views
为什么 rust-lang 吸引我? by 勇浩 赖
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?
勇浩 赖2.7K views
Behavior+tree+ai lite by 勇浩 赖
Behavior+tree+ai liteBehavior+tree+ai lite
Behavior+tree+ai lite
勇浩 赖2.1K views
敏捷网游架构与性能的新玩法 by 勇浩 赖
敏捷网游架构与性能的新玩法敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法
勇浩 赖1.1K views
先用再学 - 借助 Xna 快速开发游戏原型 by 勇浩 赖
先用再学  - 借助 Xna 快速开发游戏原型先用再学  - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型
勇浩 赖904 views
关于Bitworld的一些话题222 by 勇浩 赖
关于Bitworld的一些话题222关于Bitworld的一些话题222
关于Bitworld的一些话题222
勇浩 赖1.3K views
03 -黄朝兴--腾讯游戏 by 勇浩 赖
03 -黄朝兴--腾讯游戏03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏
勇浩 赖881 views
abu.rpc intro by 勇浩 赖
abu.rpc introabu.rpc intro
abu.rpc intro
勇浩 赖1.6K views
06 -甄焱琨--知识转化为资源 by 勇浩 赖
06 -甄焱琨--知识转化为资源06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源
勇浩 赖409 views
07 -林伟铃--成长中的36氪 by 勇浩 赖
07 -林伟铃--成长中的36氪07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪
勇浩 赖753 views
01 -阿朱--简单事情夯实做 by 勇浩 赖
01 -阿朱--简单事情夯实做01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做
勇浩 赖479 views
Python 温故 by 勇浩 赖
Python 温故Python 温故
Python 温故
勇浩 赖1.6K views
如何做好沙龙演讲 by 勇浩 赖
如何做好沙龙演讲如何做好沙龙演讲
如何做好沙龙演讲
勇浩 赖1.2K views
虚拟世界是怎么炼成的(图片版) by 勇浩 赖
虚拟世界是怎么炼成的(图片版)虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)
勇浩 赖473 views
Techparty story by 勇浩 赖
Techparty storyTechparty story
Techparty story
勇浩 赖545 views

Python 于 webgame 的应用