async def _create_transaction(self, msg, *args, **kwargs):
        """
        Create a transaction with the distant server
        :param msg: message to be sent
        :param args: args to be sent to the coroutines given to `register_transaction`
        :param kwargs: kwargs to be sent to the coroutines given to `register_transaction`
        """
        recv_msgs, get_key, _1, _2, _3 = self._msgs_registered[msg.__msgtype__]
        key = get_key(msg)

        if key in self._transactions[recv_msgs[0]]:
            # If we already have a request for this particular key, just add it on the list of things to call
            for recv_msg in recv_msgs:
                self._transactions[recv_msg][key].append((args, kwargs))
        else:
            # If that's not the case, add us in the queue, and send the message
            for recv_msg in recv_msgs:
                self._transactions[recv_msg][key] = [(args, kwargs)]
            await ZMQUtils.send(self._socket, msg)
Create a transaction with the distant server
        :param msg: message to be sent
        :param args: args to be sent to the coroutines given to `register_transaction`
        :param kwargs: kwargs to be sent to the coroutines given to `register_transaction`