LINUX.ORG.RU

python multiprocessing.Queue.empty()


0

0

Иногда после (быстрого) заполнения Queue

for i in xrange(N):
  q.put(i)

вызов из того же потока q.empty() возвращает True (хотя q.qsize() всегда возвращает правильное значение N). Иллюстрация:

from multiprocessing import Queue

N = 100

q = Queue()
while True:
  for i in xrange(N):
    q.put(i)
  r = q.empty()
  if r == True:
    print 'Gotcha!'
    print 'q.empty()=%s' % r
    break
  for i in xrange(N):
    q.get()

# Тут можно вставить очистку очереди; но необходимости нет.

В доке написано, что «Because of multithreading/multiprocessing semantics, this is not reliable.», но неужели до такой степени всё плохо, что даже из одного потока всё непредсказуемо?

★★★★

телепати мод
я не понимаю, что делает этот код

  r = q.empty()
  if r == True:
    print 'Gotcha!'
    print 'q.empty()=%s' % r

но после первого вызова q.empty(), q вполне могла заполниться
и при вызове из print уже быть не empty

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

>я не понимаю, что делает этот код

empty() проверяет, пуста ли очередь. В начале мы её заполняем, потом проверяем, пуста ли, потом освобождаем. По идеи после заполнения она всегда должна быть не пуста (по крайней мере с точки зрения логики).

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

from multiprocessing import Queue

N = 100

# Создаём очередь.
q = Queue()
while True:
  # Кладём в неё N элементов.
  for i in xrange(N):
    q.put(i)
  # Проверяем, пуста ли очередь.
  r = q.empty()
  # Если очередь пуста, значит что-то пошло не так.
  if r == True:
    print 'Gotcha!'
    print 'q.empty()=%s' % r
    break
  # Очищаем очередь.
  for i in xrange(N):
    q.get()

# Тут можно вставить очистку очереди; но необходимости нет.

Davidov ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.