def call(self, args=None, kwargs=None, node=None, send_timeout=<NUM_LIT:1000>, recv_timeout=<NUM_LIT>, zmq_ctx=None):
context = zmq_ctx or zmq.Context()<EOL>assert isinstance(context, zmq.Context)<EOL>args = args or ()<EOL>assert isinstance(args, tuple)<EOL>kwargs = kwargs or {}<EOL>assert isinstance(kwargs, dict)<EOL>socket = context.socket(zmq.REQ)<EOL>for n, a in [(n, a) for (n, a) in self.providers if (not node or n == node)]:<EOL><INDENT>socket.connect(a)<EOL><DEDENT>fullreq = ServiceRequest(service=self.name, args=pickle.dumps(args), kwargs=pickle.dumps(kwargs))<EOL>poller = zmq.Poller()<EOL>poller.register(socket)  <EOL>evts = dict(poller.poll(send_timeout))<EOL>if socket in evts and evts[socket] == zmq.POLLOUT:<EOL><INDENT>socket.send(fullreq.serialize())<EOL>evts = dict(poller.poll(recv_timeout))  <EOL>if socket in evts and evts[socket] == zmq.POLLIN:<EOL><INDENT>resp = socket.recv()<EOL>fullresp = ServiceResponse_dictparse(resp)<EOL>if fullresp.has_field('<STR_LIT>'):<EOL><INDENT>return pickle.loads(fullresp.response)<EOL><DEDENT>elif fullresp.has_field('<STR_LIT>'):<EOL><INDENT>svcexc = fullresp.exception  <EOL>tb = pickle.loads(svcexc.traceback)<EOL>if Traceback and isinstance(tb, Traceback):<EOL><INDENT>reraise(pickle.loads(svcexc.exc_type), pickle.loads(svcexc.exc_value), tb.as_traceback())<EOL><DEDENT>else:  <EOL><INDENT>reraise(pickle.loads(svcexc.exc_type), pickle.loads(svcexc.exc_value), None)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise UnknownResponseTypeException("<STR_LIT>".format(type(fullresp)))<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise ServiceCallTimeout("<STR_LIT>")<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise ServiceCallTimeout("<STR_LIT>")<EOL><DEDENT>
Calls a service on a node with req as arguments. if node is None, a node is chosen by zmq.
if zmq_ctx is passed, it will use the existing context
Uses a REQ socket. Ref : http://api.zeromq.org/2-1:zmq-socket
:param node : the node name