By one-shot you mean dynamically enforced, right? I.e. if you invoke it a second time it will raise an exception?
Each time you resume the execution of a fiber, it continues to execute until it reaches its next yield point. There is no way to go "back in time" and resume execution from a previous state of the fiber, which is what multishot coroutines or the fork system call would let you do.