I've seen this approach appear without a name very often in highly concurrent Haskell, Erlang and Elixir code. Often a "safe" race combinator appears in good libraries that handles graceful termination. So much so that you can often find local libraries that look like this Haskell code:
speculatively :: Int -> IO a -> IO (Either a a)
speculatively ms action = race action (threadDelay ms >> action)