The lock object needs to be per-instance, but threading.Lock() returns a new lock instance with each call so this needs to be in the constructor so it's self._lock.acquire(). I think it's also a better pattern to use:

   with self._lock:
       self._abort_now = True

because it's exception safe. Not a big deal on a simple assignment, though I've been caught by "simple assignments" turning out to be complex traits handling code. :)