Uno-Dan

Untitled

Apr 10th, 2019
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.69 KB | None | 0 0
  1.  
  2. from sys import stdout
  3. from time import sleep
  4. from random import randint
  5. from threading import Thread
  6.  
  7. from zmq import Poller, Context
  8. from zmq.backend.cython import proxy
  9. from zmq.backend.cython.constants import ROUTER, DEALER, POLLIN
  10.  
  11.  
  12. def tprint(msg):
  13.     stdout.write(msg + '\n')
  14.     stdout.flush()
  15.  
  16.  
  17. CLIENT_ADDR = 'eta'
  18. CLIENT_PORT = '2960'
  19. SERVER_ADDR = 'eta'
  20. SERVER_PORT = '2961'
  21.  
  22.  
  23. class Client(Thread):
  24.     def __init__(self, key):
  25.         self.id = key
  26.         Thread.__init__ (self)
  27.  
  28.     def run(self):
  29.         context = Context()
  30.         socket = context.socket(DEALER)
  31.  
  32.         identity = f'worker-{self.id}'
  33.  
  34.         socket.identity = identity.encode('ascii')
  35.         socket.connect(f'tcp://{CLIENT_ADDR}:{CLIENT_PORT}')
  36.  
  37.         print(f'Client {identity} started')
  38.         poll = Poller()
  39.         poll.register(socket, POLLIN)
  40.  
  41.         reqs = 0
  42.         while True:
  43.             reqs += 1
  44.             print(f'Req {reqs} sent..')
  45.             socket.send_string(f'request {reqs}')
  46.             for i in range(5):
  47.                 sockets = dict(poll.poll(1000))
  48.                 if socket in sockets:
  49.                     msg = socket.recv()
  50.                     tprint(f'Client {identity} received: {msg}')
  51.  
  52.             if reqs == 5:
  53.                 break
  54.  
  55.         socket.close()
  56.         context.term()
  57.  
  58.  
  59. class Server(Thread):
  60.     def __init__(self):
  61.         Thread.__init__ (self)
  62.  
  63.     def run(self):
  64.         context = Context()
  65.         frontend = context.socket(ROUTER)
  66.         frontend.bind(f'tcp://*:{CLIENT_PORT}')
  67.  
  68.         backend = context.socket(DEALER)
  69.         backend.bind('inproc://backend')
  70.  
  71.         workers = []
  72.         for i in range(5):
  73.             worker = Worker(context)
  74.             worker.start()
  75.             workers.append(worker)
  76.  
  77.         proxy(frontend, backend)
  78.  
  79.         frontend.close()
  80.         backend.close()
  81.         context.term()
  82.  
  83.  
  84. class Worker(Thread):
  85.     def __init__(self, context):
  86.         Thread.__init__ (self)
  87.         self.context = context
  88.  
  89.     def run(self):
  90.         worker = self.context.socket(DEALER)
  91.         worker.connect('inproc://backend')
  92.         tprint('Worker started')
  93.  
  94.         while True:
  95.             ident, msg = worker.recv_multipart()
  96.             tprint(f'Worker received {msg} from {ident}')
  97.             replies = randint(0, 4)
  98.             for i in range(replies):
  99.                 sleep(1. / (randint(1, 10)))
  100.                 worker.send_multipart([ident, msg])
  101.  
  102.         worker.close()
  103.  
  104.  
  105. def main():
  106.     server = Server()
  107.     server.start()
  108.  
  109.     for i in range(3):
  110.         client = Client(i)
  111.         client.start()
  112.  
  113.     server.join()
  114.  
  115.  
  116. if __name__ == "__main__":
  117.     main()
Advertisement
Add Comment
Please, Sign In to add comment