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
Revision 13 as of 2016-09-27 22:11:02
  • Python
  • Twisted

Twisted

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

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

{{{#highlight python from twisted.web import server from twisted.web import resource from twisted.internet import reactor from twisted.internet import endpoints import time import sys

class Handler(resource.Resource):

  • isLeaf = True numberRequests = 0 def render_GET(self, request):
    • self.numberRequests += 1 time.sleep(0.1) # wait 100 ms request.setHeader(b"content-type", b"text/plain") content = u"I am request #{}\n".format(self.numberRequests) return content.encode("ascii")

if name=='main':

  • port = sys.argv[1] print('Listening on port %s'%(port)) endpoints.serverFromString(reactor,"tcp:%s" %(port) ).listen(server.Site(Handler())) 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