code: def lockfile(path):
      '''
      A file lock with-block helper.
  
      Args:
          path (str): A path to a lock file.
  
      Examples:
  
          Get the lock on a file and dostuff while having the lock::
  
              path = '/hehe/haha.lock'
              with lockfile(path):
                  dostuff()
  
      Notes:
          This is curently based on fcntl.lockf(), and as such, it is purely
          advisory locking. If multiple processes are attempting to obtain a
          lock on the same file, this will block until the process which has
          the current lock releases it.
  
      Yields:
          None
      '''
      with genfile(path) as fd:
          fcntl.lockf(fd, fcntl.LOCK_EX)
          yield Nonf lockfile(path):
      '''
      A file lock with-block helper.
  
      Args:
          path (str): A path to a lock file.
  
      Examples:
  
          Get the lock on a file and dostuff while having the lock::
  
              path = '/hehe/haha.lock'
              with lockfile(path):
                  dostuff()
  
      Notes:
          This is curently based on fcntl.lockf(), and as such, it is purely
          advisory locking. If multiple processes are attempting to obtain a
          lock on the same file, this will block until the process which has
          the current lock releases it.
  
      Yields:
          None
      '''
      with genfile(path) as fd:
          fcntl.lockf(fd, fcntl.LOCK_EX)
          yield None
docs: A file lock with-block helper.
  
      Args:
          path (str): A path to a lock file.
  
      Examples:
  
          Get the lock on a file and dostuff while having the lock::
  
              path = '/hehe/haha.lock'
              with lockfile(path):
                  dostuff()
  
      Notes:
          This is curently based on fcntl.lockf(), and as such, it is purely
          advisory locking. If multiple processes are attempting to obtain a
          lock on the same file, this will block until the process which has
          the current lock releases it.
  
      Yields:
          None