zeroMQ初体验-19.应答模式进阶(五)-异步式应答
来源:互联网 发布:苹果电脑优缺点知乎 编辑:程序博客网 时间:2024/05/29 12:25
恩,这应该算是比较实用的部分了。
模式图:
作为一个异步的服务器,详图应该是这样的:
这里的数据传递顺序是这样的:
在这里有可能碰到一个比较经典的c/s问题:
c端太多,耗尽s端资源怎么办?
这就需要靠谱些的机制了,比如通过“心跳”来确定是否应该释放这个c端的资源等。当然,那就是另外一个话题了。
模式图:
- import zmq
- import threading
- import time
- from random import choice
- class ClientTask(threading.Thread):
- """ClientTask"""
- def init(self):
- threading.Thread.init (self)
- def run(self):
- context = zmq.Context()
- socket = context.socket(zmq.XREQ)
- identity = 'worker-%d' % (choice([0,1,2,3,4,5,6,7,8,9]))
- socket.setsockopt(zmq.IDENTITY, identity )
- socket.connect('tcp://localhost:5570')
- print 'Client %s started' % (identity)
- poll = zmq.Poller()
- poll.register(socket, zmq.POLLIN)
- reqs = 0
- while True:
- for i in xrange(5):
- sockets = dict(poll.poll(1000))
- if socket in sockets:
- if sockets[socket] == zmq.POLLIN:
- msg = socket.recv()
- print '%s: %s\n' % (identity, msg)
- del msg
- reqs = reqs + 1
- print 'Req #%d sent..' % (reqs)
- socket.send('request #%d' % (reqs))
- socket.close()
- context.term()
- class ServerTask(threading.Thread):
- """ServerTask"""
- def init(self):
- threading.Thread.init (self)
- def run(self):
- context = zmq.Context()
- frontend = context.socket(zmq.XREP)
- frontend.bind('tcp://*:5570')
- backend = context.socket(zmq.XREQ)
- backend.bind('inproc://backend')
- workers = []
- for i in xrange(5):
- worker = ServerWorker(context)
- worker.start()
- workers.append(worker)
- poll = zmq.Poller()
- poll.register(frontend, zmq.POLLIN)
- poll.register(backend, zmq.POLLIN)
- while True:
- sockets = dict(poll.poll())
- if frontend in sockets:
- if sockets[frontend] == zmq.POLLIN:
- msg = frontend.recv()
- print 'Server received %s' % (msg)
- backend.send(msg)
- if backend in sockets:
- if sockets[backend] == zmq.POLLIN:
- msg = backend.recv()
- frontend.send(msg)
- frontend.close()
- backend.close()
- context.term()
- class ServerWorker(threading.Thread):
- """ServerWorker"""
- def init(self, context):
- threading.Thread.init (self)
- self.context = context
- def run(self):
- worker = self.context.socket(zmq.XREQ)
- worker.connect('inproc://backend')
- print 'Worker started'
- while True:
- msg = worker.recv()
- print 'Worker received %s' % (msg)
- replies = choice(xrange(5))
- for i in xrange(replies):
- time.sleep(1/choice(range(1,10)))
- worker.send(msg)
- del msg
- worker.close()
- def main():
- """main function"""
- server = ServerTask()
- server.start()
- for i in xrange(3):
- client = ClientTask()
- client.start()
- server.join()
- if name == "main":
- main()
import zmqimport threadingimport timefrom random import choiceclass ClientTask(threading.Thread): """ClientTask""" def init(self): threading.Thread.init (self) def run(self): context = zmq.Context() socket = context.socket(zmq.XREQ) identity = 'worker-%d' % (choice([0,1,2,3,4,5,6,7,8,9])) socket.setsockopt(zmq.IDENTITY, identity ) socket.connect('tcp://localhost:5570') print 'Client %s started' % (identity) poll = zmq.Poller() poll.register(socket, zmq.POLLIN) reqs = 0 while True: for i in xrange(5): sockets = dict(poll.poll(1000)) if socket in sockets: if sockets[socket] == zmq.POLLIN: msg = socket.recv() print '%s: %s\n' % (identity, msg) del msg reqs = reqs + 1 print 'Req #%d sent..' % (reqs) socket.send('request #%d' % (reqs)) socket.close() context.term()class ServerTask(threading.Thread): """ServerTask""" def init(self): threading.Thread.init (self) def run(self): context = zmq.Context() frontend = context.socket(zmq.XREP) frontend.bind('tcp://*:5570') backend = context.socket(zmq.XREQ) backend.bind('inproc://backend') workers = [] for i in xrange(5): worker = ServerWorker(context) worker.start() workers.append(worker) poll = zmq.Poller() poll.register(frontend, zmq.POLLIN) poll.register(backend, zmq.POLLIN) while True: sockets = dict(poll.poll()) if frontend in sockets: if sockets[frontend] == zmq.POLLIN: msg = frontend.recv() print 'Server received %s' % (msg) backend.send(msg) if backend in sockets: if sockets[backend] == zmq.POLLIN: msg = backend.recv() frontend.send(msg) frontend.close() backend.close() context.term() class ServerWorker(threading.Thread): """ServerWorker""" def init(self, context): threading.Thread.init (self) self.context = context def run(self): worker = self.context.socket(zmq.XREQ) worker.connect('inproc://backend') print 'Worker started' while True: msg = worker.recv() print 'Worker received %s' % (msg) replies = choice(xrange(5)) for i in xrange(replies): time.sleep(1/choice(range(1,10))) worker.send(msg) del msg worker.close()def main(): """main function""" server = ServerTask() server.start() for i in xrange(3): client = ClientTask() client.start() server.join() if name == "main": main()
作为一个异步的服务器,详图应该是这样的:
这里的数据传递顺序是这样的:
- client server frontend worker
- [ XREQ ]<---->[ XREP <----> XREQ <----> XREQ ]
- 1 part 2 parts 2 parts
client server frontend worker [ XREQ ]<---->[ XREP <----> XREQ <----> XREQ ] 1 part 2 parts 2 parts
在这里有可能碰到一个比较经典的c/s问题:
c端太多,耗尽s端资源怎么办?
这就需要靠谱些的机制了,比如通过“心跳”来确定是否应该释放这个c端的资源等。当然,那就是另外一个话题了。
- zeroMQ初体验-19.应答模式进阶(五)-异步式应答
- zeroMQ初体验-21.应答模式进阶(七)-云计算
- zeroMQ初体验-20.应答模式进阶(六)-多对多路由模式
- zeroMQ初体验-15.应答模式进阶(一)-数据的封装
- zeroMQ初体验-16.应答模式进阶(二)-定制路由1
- zeroMQ初体验-17.应答模式进阶(三)-定制路由2
- zeroMQ初体验-18.应答模式进阶(四)-定制路由3
- Python实现ZeroMQ请求-应答模式
- ZeroMQ指南:第3章:高级请求-应答模式
- ZeroMQ指南:第3章:高级请求-应答模式
- ZeroMQ指南:第3章:高级请求-应答模式
- 初探ZeroMQ(二) 请求-应答模式中套结字总结
- ZeroMQ指南:第3章:高级请求-应答模式
- gRPC异步处理应答
- Reactor 应答者模式
- activemq 应答模式
- RabbitMQ的应答模式
- zeroMQ初体验-13.发布/订阅模式 进阶
- 关于linux下求文件行数的问题
- 使用Struts1实现文件上传
- 软件
- 内部类
- zeroMQ初体验-18.应答模式进阶(四)-定制路由3
- zeroMQ初体验-19.应答模式进阶(五)-异步式应答
- Stress与Strain+Tensor
- jquery验证网址
- powerbuilder PB 操作内存
- zeroMQ初体验-20.应答模式进阶(六)-多对多路由模式
- string类型常用方法总结
- Flashplayer11 And AIR3游戏应用介绍视频
- substring
- zeroMQ初体验-21.应答模式进阶(七)-云计算