-
-
Notifications
You must be signed in to change notification settings - Fork 32.3k
bpo-33078 - FIX queue size on pickling error #6119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the fix! A few comments below.
Lib/multiprocessing/queues.py
Outdated
@@ -255,6 +255,7 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, | |||
info('error in queue thread: %s', e) | |||
return | |||
else: | |||
queue_sem.release() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add a comment explaining why you need to adjust the semaphore's value?
Lib/test/_test_multiprocessing.py
Outdated
q.put(NotSerializable()) | ||
q.put(True) | ||
# bpo-30595: use a timeout of 1 second for slow buildbots | ||
self.assertTrue(q.get(timeout=1.0)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should you add a check for q.qsize()
as well?
@@ -0,0 +1,2 @@ | |||
Fix the size handeling in multiprocessing.Queue when a pickling error |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo: "handling".
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
q = self.Queue(maxsize=1) | ||
q.put(NotSerializable()) | ||
q.put(True) | ||
self.assertEqual(q.qsize(), 1) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this check correct? Depending on when the worker thread triggers, it might return 2, no?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it is correct because maxsize=1
so the second q.put
should return only once the failure has been triggered.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a good point, thank you.
GH-6178 is a backport of this pull request to the 3.7 branch. |
(cherry picked from commit e2f33ad) Co-authored-by: Thomas Moreau <[email protected]>
(cherry picked from commit e2f33ad) Co-authored-by: Thomas Moreau <[email protected]>
The
Queue._feed
does not properly handle the size of theQueue
on errors. This can lead to a situation where theQueue
is considered asFull
when it is empty. Here is a reproducing script:This PR fixes this behavior.
https://bugs.python.org/issue33078