def send_request_and_get_reply_and_data( server_node_name, server_address, client_tag, client_address, request, data=None ): log = logging.getLogger("send_request_and_get_reply_and_data") context = zmq.Context() deliverator = Deliverator() pull_server = GreenletPULLServer( context, client_address, deliverator ) pull_server.start() resilient_client = GreenletResilientClient( context, server_node_name, server_address, client_tag, client_address, deliverator, ) resilient_client.start() # loop until the resilient client connects test_status_count = 0 while True: status_name, _, __ = resilient_client.test_current_status() if status_name == "connected": break test_status_count += 1 if test_status_count > 5: log.error("too many status retries") raise UtilError("too many status retries") log.warn("status retry delay") gevent.sleep(10.0) delivery_channel = resilient_client.queue_message_for_send(request, data) reply, data = delivery_channel.get() pull_server.kill() resilient_client.kill() pull_server.join() resilient_client.join() context.term() return reply, data