Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5118963
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2016-03-12 15:05:58


  1. # -*- encoding: utf-8 -*-

  2. """
  3. 通过tasklet构造的对象只是加入调度队列,必须等待schedule,
  4. 真正执行队列即执行可以通过四个方法:stackless.run(), stackless.schedule(),channel.send(), channel.receive()
  5. 任何新建的tasklet必须等待schedule方法来调度,否则无法执行。
  6. """

  7. import stackless,twisted
  8. from twisted.internet import reactor
  9. from twisted.web import client

  10. class MyTasklet():

  11.     def result(self, content):
  12.         print "html result-----" + content[0:20]
  13.         self.mychannel.send(content)

  14.     def resultError(self, content):
  15.         print "html result error-----" + str(content)
  16.         self.mychannel.send(content)

  17.     def tasklet(self):
  18.         print('MyTasklet.tasklet...', stackless.getcurrent())
  19.         self.mychannel = stackless.channel()
  20.         self._tasklet = stackless.getcurrent()
  21.         self._tasklet._owner = self
  22.         self.handle()

  23.     def handle(self):
  24.         print('MyTasklet.handle')
  25.         content = ''
  26.         try:
  27.             content = self.reqPage()
  28.         except Exception, e:
  29.             print('Exception', e.message)
  30.         print('html content', content[:20]) # 异步返回之后可以继续干别的事情

  31.     def reqPage(self):
  32.         deferred =client.getPage("http://blog.csdn.net")
  33.         deferred.addCallback(self.result)
  34.         deferred.addErrback(self.resultError)
  35.         return self.mychannel.receive() # 当前tasklet 阻塞,不影响其它tasklet运行

  36. from twisted.web import server, resource
  37. from twisted.internet import reactor

  38. # 创建一个简单的web server,接收请求
  39. class Simple(resource.Resource):
  40.     isLeaf=True
  41.     def render_GET(self, request):
  42.         startTasklet() # 接收到请求之后,创建tasklet,进入stackless的世界
  43.         return "Hello, world!"
  44. reactor.listenTCP(8080, server.Site(Simple()))

  45. def startTasklet():
  46.     print 'startTasklet...............'
  47.     mytask = MyTasklet()
  48.     stackless.tasklet(mytask.tasklet)() # 创建tasklet
  49.     tasklet = stackless.schedule() # 启动调度
  50.     print('startTasklet.tasklet', tasklet)

  51. reactor.run() # 启动reactor mainloop

  52. # 如果前面有tasklet,可以将reactor.run()换成下面两句
  53. # stackless.tasklet(reactor.run)()
  54. # stackless.run()

高并发情况下需要做一定处理

原文链接
阅读(1428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~