2017-12-01 2 views
10

내장 된 기능 len() (https://docs.python.org/3/library/functions.html#len는) 반환 "객체의 길이 (항목 수)"을, 그러나 이것은 queue.Queue (https://docs.python.org/3/library/queue.html)에 대해 구현되지 않습니다. queue.Queue은 분명히 길이가있을 때 큐의 대략적인 크기를 반환하는 qsize() 메서드를 가지고 있습니다. 생성자에서 Queue의 최대 길이를 지정할 수 있습니다. 비슷한 collections.dequelen과 작동합니다.len()이 큐에 구현되지 않은 이유는 무엇입니까?

queue.Queuelen()을 사용하지 않는 이유는 무엇입니까? 또는 : qsize이 기능을 사용하기 위해 __len__으로 대신 명명 된 경우의 문제점은 무엇입니까?

+2

아마 사람들은'len'이 정확한 값을 반환하기를 기대하기 때문에, 대략적인 값은 아닙니다. 그리고 그것은 빠르다. 정확한 '__len__'을 구현하기 위해서는 성능에 영향을 줄 수있는 추가 및 삭제를 방지하기 위해 대기열을 잠궈 야합니다. –

답변

10

은 전문가가 사용하기를 고려해야 할 것이지만 "친숙한 이름"을 사용하는 것이 전문가가 아닌 전문가에게 권장할만한 "매력적인 성가신"이기 때문에 queue.Queue에 구현되어 있지 않습니다. (listdeque 등) 대부분의 시퀀스 유형 달리

하는 queue.Queue 구체적는 멀티 쓰레드 문맥에서 사용 된 (그리고 마찬가지로 multiprocessing 모듈의 대기열 타입)하기위한 것이다. Queue의 항목 수는 특정 시간에 확실한 값을 가지지 만 사용자 코드는 그 값이 무엇인지 알아낼 수 없습니다. .qsize()에 대한 호출이 돌아오고 코드가 일 때이 반환 값으로 표시 될 때까지 , 많은 수의 다른 스레드 (또는 프로세스의 경우)가 큐의 내용을 원하는만큼 변경했을 수 있습니다.

그래서 .qsize()에 의해 반환되는 값에 대한라고 할 수있는 유일한 진정한 것은 Queue에서 과거 어느 시간을 거기에 많은 가치를 가지고 있다는 것입니다. 반환 값을 사용할 수있게 될 때까지는 임의로 더 많은 (또는 더 적은) 값을 가질 수 있습니다.

하나의 스레드 만 실행하는 경우에는 물론 그렇지만 Queue의 구현 복잡성을 지불 할 필요가 없습니다 (대신 list 또는 deque 사용).

+0

큐에'empty()'와'full()'이 구현 된 이유는 무엇입니까? –

+5

필자가 작성한 경우'empty()'와'full()'을 구현하지 않을 것이다 ;-) 초기에는 여러 가지 옵션'timeout ='이 존재하지 않았고,'full()'과 '.put()'또는'.get()'이 성공할 가능성이 있는지를보기 위해서'empty()'가 _probabilistic _ gimmicks처럼 루프에서 사용되었습니다. 그것들을 사용하는 코드 ('qsize()'를 사용하는 코드와 같은)는 종종 타이밍 버그를 일으키지 않습니다. –

관련 문제