Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ZeroMQ - PyCon India 2013

cnu
August 31, 2013

ZeroMQ - PyCon India 2013

cnu

August 31, 2013
Tweet

More Decks by cnu

Other Decks in Programming

Transcript

  1. Build  your  next  project  -­‐‑   Super  fast,  distributed  

    and  infinitely  scalable.   Using  ZeroMQ
  2. Hello  World  Server import  zmq     context  =  zmq.Context()

        print  "Starting  hello  world  server..."   socket  =  context.socket(zmq.REP)   socket.bind("tcp://*:5555")     while  True:          message  =  socket.recv()          print  "Got:  ",  message            #    Send  the  reply.          socket.send  ("World")  
  3. Hello  World  Client import  zmq     context  =  zmq.Context()

        #    Socket  to  talk  to  server   print  "Connecting  to  hello  world  server..."   socket  =  context.socket(zmq.REQ)   socket.connect  ("tcp://localhost:5555")     #    Do  10  requests,  waiting  each  time  for  a  response   for  req_no  in  range  (10):          socket.send  ("Hello")            #    Get  the  reply.          message  =  socket.recv()          print  "Received  reply  ",  req_no,  "[",  message,  "]"  
  4. Hello  World  Client  2 import  sys   import  time  

    import  zmq     context  =  zmq.Context()   print  "Connecting  to  hello  world  server..."   socket  =  context.socket(zmq.REQ)   socket.connect  ("tcp://localhost:5555")     while  True:          socket.send(sys.argv[2])            #    Get  the  reply.          message  =  socket.recv()          print  "Received  reply  ",  "[",  message,  "]"            time.sleep(float(sys.argv[1]))  
  5. Stock  Ticker  Server import  zmq   import  time   import

     random     context  =  zmq.Context()   socket  =  context.socket(zmq.PUB)   socket.bind("tcp://*:5556")   scrips  =  ['AAPL',  'GOOG',  'MSFT',  'AMZN']     while  True:          scrip  =  random.choice(scrips)          price  =  random.randrange(20,700)                    msg  =  "%s:  %d"  %  (scrip,  price)          print  msg          socket.send(msg)          time.sleep(0.5)  
  6. Stock  Ticker  Client import  sys   import  zmq    

    context  =  zmq.Context()   socket  =  context.socket(zmq.SUB)     print  "Collecting  updates  from  stock  server..."   socket.connect  ("tcp://localhost:5556”)     scrip_filter  =  sys.argv[1:]  if  len(sys.argv)  >  1  else  ["AAPL"]   for  scrip  in  scrip_filter:          socket.setsockopt(zmq.SUBSCRIBE,  scrip)     while  True:          string  =  socket.recv()          stock,  price  =  string.split()          print  "%s:  %s"  %(stock,  price)  
  7. XKCD  Task  Ventilator import  sys   import  zmq    

    context  =  zmq.Context()     sender  =  context.socket(zmq.PUSH)   sender.bind("tcp://*:5557")     print  "Press  Enter  when  the  workers  are  ready:  "   _  =  raw_input()   print  "Sending  tasks  to  workers..."     base_url  =  'http://xkcd.com/'   urls  =  [base_url  +  str(i)  for  i  in  xrange(1,  int(sys.argv[1]))]     for  url  in  urls:          sender.send(url)  
  8. XKCD  Task  Worker import  json   import  zmq    

    import  requests   from  lxml  import  etree     def  get_title(url):          """Given  a  XKCD  url,  retrieve  the  title  of  the  image."""          r  =  requests.get(url)          tree  =  etree.HTML(r.content)          title  =  tree.xpath('//div[@id="comic"]/img/@title')          if  title:                  return  title[0]          else:                  return  None  
  9. XKCD  Task  Worker context  =  zmq.Context()     #  Socket

     to  receive  messages  on   receiver  =  context.socket(zmq.PULL)   receiver.connect("tcp://localhost:5557")     #  Socket  to  send  messages  to   sender  =  context.socket(zmq.PUSH)   sender.connect("tcp://localhost:5558")     #  Process  tasks  forever   while  True:          s  =  receiver.recv()          title  =  get_title(s)          print  s,  title            #  Send  a  JSON  payload  to  sink          sender.send(json.dumps({"url":s,  "title":title}))  
  10. XKCD  Sink import  zmq     context  =  zmq.Context()  

      #  Socket  to  receive  messages  on   receiver  =  context.socket(zmq.PULL)   receiver.bind("tcp://*:5558")     while  True:          s  =  receiver.recv()          print  s  
  11. Languages •  C/C++ •  C# •  Java •  Erlang • 

    Go •  Ruby •  Node.js •  Objective-C …