<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def lock(self, timeout='default', requested_key=None):
 """Establish a shared lock to the resource. :param timeout: Absolute time period (in milliseconds) that a resource waits to get unlocked by the locking session before returning an error. (Defaults to self.timeout) :param requested_key: Access key used by another session with which you want your session to share a lock or None to generate a new shared access key. :returns: A new shared access key if requested_key is None, otherwise, same value as the requested_key """

        timeout = self.timeout if timeout == 'default' else timeout
        timeout = self._cleanup_timeout(timeout)
        return self.visalib.lock(self.session, constants.AccessModes.shared_lock, timeout, requested_key)[0]