MoinMoin Logo
  • Comments
  • Immutable Page
  • Menu
    • Navigation
    • RecentChanges
    • FindPage
    • Local Site Map
    • Help
    • HelpContents
    • HelpOnMoinWikiSyntax
    • Display
    • Attachments
    • Info
    • Raw Text
    • Print View
    • Edit
    • Load
    • Save
  • Login

Navigation

  • Start
  • Sitemap

Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

  • Python
  • Twisted

Twisted

Twisted is an event-driven networking engine written in Python and licensed under the open source MIT license.

  • https://twistedmatrix.com/trac/wiki

  • https://twistedmatrix.com/documents/current/web/howto/using-twistedweb.html

Install from source

  • su
  • cd /tmp
  • wget http://twistedmatrix.com/Releases/Twisted/13.1/Twisted-13.1.0.tar.bz2

  • tar xvif Twisted-13.1.0.tar.bz2
  • cd Twisted-13.1.0
  • python2.7 setup.py build
  • python2.7 setup.py install

Test installation

  • python
  • from twisted.internet import protocol, reactor
  • quit()

Slackbuild

  • su
  • cd /tmp
  • wget http://slackbuilds.org/slackbuilds/14.1/python/python-twisted.tar.gz

  • tar xvzf python-twisted.tar.gz
  • cd python-twisted
  • wget https://pypi.python.org/packages/source/T/Twisted/Twisted-13.2.0.tar.bz2

  • ./python-twisted.SlackBuild

  • installpkg /tmp/python-twisted-13.2.0-x86_64-1_SBo.tgz

Slackware64 14: python-twisted-13.2.0-x86_64-1_SBo.tgz

Echo server

   1 from twisted.internet import protocol, reactor
   2 
   3 class Echo(protocol.Protocol):
   4     def dataReceived(self, data):
   5         self.transport.write(data)
   6 
   7     def connectionMade(self):
   8         print('Connection made')
   9 
  10     def connectionLost(self,reason):
  11         print('Connection lost')
  12 class EchoFactory(protocol.Factory):
  13     def buildProtocol(self, addr):
  14         return Echo()
  15 
  16 if __name__=='__main__':
  17     reactor.listenTCP(1234, EchoFactory())
  18     reactor.run()

Echo client

   1 import threading
   2 import time
   3 import socket
   4 
   5 class Client (threading.Thread):
   6     def __init__(self):
   7         threading.Thread.__init__(self) #required
   8                 
   9     def run(self):
  10         for x in range(1,100):
  11             HOST = 'localhost'
  12             PORT = 1234
  13             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  14             print('connecting...')
  15             s.connect((HOST, PORT))
  16             print('sending config...')
  17             s.send('test')
  18             s.close()
  19             print('complete')
  20 
  21 if __name__=='__main__':
  22 
  23     clients=[]
  24     for x in range(1,100):
  25         clients.append( Client() )
  26 
  27     for c in clients:
  28         c.start()

Sample web server

   1 # from https://twistedmatrix.com/trac/
   2 from twisted.web import server, resource
   3 from twisted.internet import reactor, endpoints
   4 
   5 class Counter(resource.Resource):
   6     isLeaf = True
   7     numberRequests = 0
   8 
   9     def render_GET(self, request):
  10         self.numberRequests += 1
  11         request.setHeader(b"content-type", b"text/plain")
  12         content = u"I am request #{}\n".format(self.numberRequests)
  13         return content.encode("ascii")
  14 
  15 endpoints.serverFromString(reactor, "tcp:8080").listen(server.Site(Counter()))
  16 reactor.run()
  • apt-get instal apache2-utils
  • apt-get install nginx
  • apt-get install links

/etc/nginx/conf.d/load-balancer.conf

upstream backend {
   server 172.28.128.4:8080;
   server 172.28.128.3:8080;
   server 172.28.128.6:8080;
}

server {
   listen 8080;

   location / {
      proxy_pass http://backend;
   }
}

twistedtest.py

   1 from twisted.web import server
   2 from twisted.web import resource
   3 from twisted.internet import reactor
   4 from twisted.internet import endpoints
   5 import time
   6 import sys
   7 
   8 class Handler(resource.Resource):
   9     isLeaf = True
  10     numberRequests = 0
  11 
  12     def render_GET(self, request):
  13         self.numberRequests += 1
  14         time.sleep(0.1) # wait 100 ms
  15         request.setHeader(b"content-type", b"text/plain")
  16         content = u"I am request #{}\n".format(self.numberRequests)
  17         return content.encode("ascii")
  18 
  19 if __name__=='__main__':
  20     port = sys.argv[1]
  21     print('Listening on port %s'%(port))
  22     endpoints.serverFromString(reactor,"tcp:%s" %(port) ).listen(server.Site(Handler()))
  23     reactor.run()

twistedclient.py

   1 import threading
   2 import urllib2
   3 import time
   4 import sys
   5 
   6 class Client(threading.Thread):
   7     def __init__(self,urls,nrReqs):
   8         threading.Thread.__init__(self) #required
   9         self.urls=urls
  10         self.nrReqs=nrReqs
  11         self.count=0       
  12     def run(self):
  13         loop=True
  14         urlIdx=0
  15         while loop:
  16             url=urls[urlIdx]
  17             conn=urllib2.urlopen(url)
  18             resp=conn.read()   
  19             if self.count < self.nrReqs-1:
  20                 self.count+=1
  21                 urlIdx+=1
  22                 if urlIdx>=len(urls):
  23                     urlIdx=0
  24             else:
  25                 loop=False
  26                 
  27 if __name__=='__main__':      
  28     if len(sys.argv) == 4:
  29         nrUrlsToUse = int(sys.argv[1])
  30         nrClients=int(sys.argv[2])
  31         nrReqs=int(sys.argv[3])
  32     
  33         start = time.time()
  34         urls=['http://localhost:8080/','http://localhost:8081/','http://localhost:8082/','http://localhost:8083/','http://localhost:8084/','http://localhost:8085/','http://localhost:8086/','http://localhost:8087/','http://localhost:8088/','http://localhost:8089/','http://localhost:8090/','http://localhost:8091/','http://localhost:8092/','http://localhost:8093/','http://localhost:8094/','http://localhost:8095/','http://localhost:8096/','http://localhost:8097/','http://localhost:8098/','http://localhost:8099/']
  35     
  36         if nrUrlsToUse<len(urls):
  37             urls = urls[0:nrUrlsToUse]
  38     
  39 
  40         clients=[]
  41     
  42         for client in range(0,nrClients):
  43             c = Client(urls,nrReqs)
  44             clients.append( c )
  45             c.start()
  46         
  47         for client in clients:
  48             client.join()
  49         
  50         end = time.time()
  51         delta = end-start
  52         totalRequests = nrReqs*nrClients
  53         reqPerSec = totalRequests/delta
  54         print('Test time: %d Total requests:%d ReqsPerSec:%f TotalURLs: %d'%(delta,totalRequests,reqPerSec,len(urls)))
  55     else:
  56         print('Usage: twistedclient.py <nrUrlsToUse> <nrClients> <nrReqs>')    
  • MoinMoin Powered
  • Python Powered
  • GPL licensed
  • Valid HTML 4.01