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.
I was experiencing hangs similar to #449, #437, and #354.
The issue I was seeing is basically a race condition present in the
AsyncResult
class.If another thread happens to get the request data in a call to
Connection.serve
thenAsyncResult.wait
will end up going around thewhile not self._is_ready
loop an additional time, which is why there is a timeout on the request, but no "result expired" exception. The other thread will call the thread callback (Connection._seq_request_callback
), but may not set_is_ready
in time for the loop inAsyncResult.wait
to break without re-enteringConnection.serve
.This PR does fix the hanging issues for my application, and I suspect it will help others as well, but I do not think it addresses the root of the problem: that other threads may call callbacks on async requests at the
Connection
level.This fix changes the
AsyncResult._is_ready
variable from abool
to athreading.Event
and waits on it if the call toConnection.serve
inAsyncResult.wait
returns True (data was dispatched).Let me know if you have questions, comments, revisions, etc.
Hope this helps!