Skip to content

Instantly share code, notes, and snippets.

@ggarlic
Created April 18, 2014 07:07
Show Gist options
  • Select an option

  • Save ggarlic/11028662 to your computer and use it in GitHub Desktop.

Select an option

Save ggarlic/11028662 to your computer and use it in GitHub Desktop.
async and sync method in twisted
import time
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
from twisted.web import server
from twisted.internet.protocol import ProcessProtocol
from twisted.internet.defer import Deferred
from calendar import calendar
class MyProcessProtocol(ProcessProtocol):
data = ""
def connectionMade(self):
self.d = Deferred()
def outReceived(self, data):
self.data += data
def processEnded(self, reason):
self.d.callback(self.data)
class Async(Resource):
isLeaf = True
def render_GET(self, request):
def _on_end(data, begin, request):
end = time.time()
request.write(data)
request.write(str((begin, end, end-begin)))
request.finish()
pp = MyProcessProtocol()
begin = time.time()
reactor.spawnProcess(pp, "sh", ["sh", "-c", "/sbin/ping -c 11 baidu.com"])
pp.d.addBoth(_on_end, begin, request)
return server.NOT_DONE_YET
class Sync(Resource):
isLeaf = True
def render_GET(self, request):
time.sleep(10)
end = time.time()
return str(end)
class YearPage(Resource):
def __init__(self, year):
Resource.__init__(self)
self.year = year
def render_GET(self, request):
return "<html><body><pre>%s</pre></body></html>" % (calendar(self.year),)
class Calendar(Resource):
def getChild(self, name, request):
if name == "async":
return Async()
if name == "sync":
return Sync()
if name.isdigit():
return YearPage(int(name))
root = Calendar()
factory = Site(root)
reactor.listenTCP(8880, factory)
reactor.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment