关于uwsgi+gevent+web.py的备忘

简单入门:
[url=http://projects.unbit.it/uwsgi/]uwsgi[/url]:nginx般的优雅控制
[url=http://www.gevent.org/]gevent[/url]:高效、无缝的接入
[url=http://webpy.org/]web.py[/url]:简洁

关于uwsgi+web.py:

import web

urls = (
'/(.*)', 'hello'
)
app = web.application(urls, globals())

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

application = app.wsgifunc()

执行:
./uwsgi -s /tmp/web.py.socket -w testapp


关于uwsgi+gevent:

import gevent
import gevent.socket

def bg_task():
for i in range(1,10):
print "background task", i
gevent.sleep(2)

def long_task():
for i in range(1,10):
print i
gevent.sleep()

def application(e, sr):

sr('200 OK', [('Content-Type','text/html')])

t = gevent.spawn(long_task)

t.join()

yield "sleeping for 3 seconds...<br/>"

gevent.sleep(3)

yield "done<br>"

yield "getting some ips...<br/>"

urls = ['www.google.com', 'www.example.com', 'www.python.org', 'projects.unbit.it']
jobs = [gevent.spawn(gevent.socket.gethostbyname, url) for url in urls]
gevent.joinall(jobs, timeout=2)

for j in jobs:
yield "ip = %s<br/>" % j.value

# this task will goes on after request end
gevent.spawn(bg_task)

执行:
uwsgi --loop gevent --socket :3031 --module myapp --async 100


关于gevent+web.py:

from gevent import monkey; monkey.patch_all()
from gevent.wsgi import WSGIServer
import gevent
import web

urls = ("/", "index",
'/long', 'long_polling')


class index:
def GET(self):
return 'Hello, world!<br>[url=/long]/long[/url]'


class long_polling:
def GET(self):
print 'handling GET context id = %s' % (id(web.ctx._getd()), )
gevent.sleep(10) # possible to block the request indefinitely, without harming others
return 'Hello, 10 seconds later'

if __name__ == "__main__":
application = web.application(urls, globals()).wsgifunc()
print 'Serving on 8088...'
WSGIServer(('', 8088), application).serve_forever()

执行:
python model.py


三合一:

from gevent import monkey; monkey.patch_all()
from gevent.wsgi import WSGIServer
import gevent
import web

urls = ("/", "index",
'/long', 'long_polling')


class index:
def GET(self):
return 'Hello, world!<br>[url=/long]/long[/url]'


class long_polling:
def GET(self):
print 'handling GET context id = %s' % (id(web.ctx._getd()), )
gevent.sleep(10) # possible to block the request indefinitely, without harming others
return 'Hello, 10 seconds later'


application = web.application(urls, globals()).wsgifunc()
#print 'Serving on 8088...'
#WSGIServer(('', 8088), application).serve_forever()
#注释掉,就这么简单

执行:
uwsgi --loop gevent --socket :3031 --module myapp --async 100


[color=red]注意:[/color]
uwsgi只支持gevent1.0以上版本,而gevent目前的stable还没有升上去,要尝新的话得要担风险。

另,我在编译uwsgi+gevent plugin时出了点问题:
[quote]
cc1: warnings being treated as errors
> plugins/gevent/gevent.c: In function ‘py_uwsgi_gevent_request’:
> plugins/gevent/gevent.c:190: warning: suggest explicit braces to avoid
> ambiguous ‘else’
> plugins/gevent/gevent.c:190: warning: suggest explicit braces to avoid
> ambiguous ‘else’
> plugins/gevent/gevent.c:199: warning: suggest explicit braces to avoid
> ambiguous ‘else’
> plugins/gevent/gevent.c:199: warning: suggest explicit braces to avoid
> ambiguous ‘else’
> plugins/gevent/gevent.c:216: warning: suggest explicit braces to avoid
> ambiguous ‘else’
> plugins/gevent/gevent.c:216: warning: suggest explicit braces to avoid
> ambiguous ‘else’
> make: *** [all] Error 1
[/quote]
这可能是gcc版本有点旧,可以用这个补丁:[url]http://projects.unbit.it/hg/uwsgi-1.0/rev/9943f97612f2[/url](感谢Roberto的帮助)

留此备忘,静待稳定版
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值