Migrate work for finished CurrentThreadExecutor
to previous executor
#494
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
A
CurrentThreadExecutor
may terminate with work still remaining in its queue, or new work may be submitted later. We previously discarded remaining work, leading to deadlocks, and raised an error on submitting late work. But if there’s anotherCurrentThreadExecutor
for the same thread below us on the stack, we should instead migrate the extra work there to allow it to eventually run.Doing this in a thread-safe way requires replacing the
queue.Queue
abstraction withcollections.deque
andthreading.ConditionVariable
(the same primitives used to implementqueue.Queue
).async_to_sync
→sync_to_async
→async_to_sync
→create_task
→sync_to_async
#492CurrentThreadExecutor
reentrant and reusing it #493