Python: Почему некоторые методы Queue.queue ненадежны? - PullRequest
7 голосов
/ 19 августа 2009

В классе queue из модуля Queue есть несколько методов, а именно qsize, empty и full, чья документация утверждает, что они "ненадежны".

Что именно в них не надежно?

Я заметил, что на сайте Python docs , о qsize сказано следующее:

Примечание: qsize ()> 0 не гарантирует что последующий get () не будет блок, также не будет qsize ()

Лично я не считаю это поведение "ненадежным". Но означает ли это «ненадежность» или есть какой-то более зловещий недостаток в этих методах?

Ответы [ 3 ]

10 голосов
/ 19 августа 2009

Да, документы используют здесь «ненадежный», чтобы передать именно это значение: например, в некотором смысле, qsize не говорит вам, сколько записей есть «прямо сейчас», концепция, которая не обязательно очень значимый в многопоточном мире (за исключением определенных точек, где принимаются меры предосторожности при синхронизации) - он сообщает вам, сколько записей у него было «некоторое время назад» ... когда вы воздействуете на эту информацию, даже в самом следующем коде операции В очереди может быть больше записей, или меньше, или вообще не может быть, в зависимости от того, какие другие потоки были за это время (если вообще что-нибудь; -).

2 голосов
/ 19 августа 2009

Я не знаю, к какому модулю очереди вы обращаетесь, укажите ссылку?

Один из возможных источников ненадежности: как правило, очередь читается одним потоком и записывается другим. Если вы единственный поток, обращающийся к очереди, то возможны надежные реализации qsize (), empty () и full (). Но как только другие потоки включаются, возвращаемое значение этих методов может быть устаревшим к тому времени, когда вы его тестируете.

0 голосов
/ 14 декабря 2013

Это один случай ненадежности в соответствии с тем, что предложил Алекс Мартелли: JoinableQueue.empty () ненадежный? Какая альтернатива?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...