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.», но неужели до такой степени всё плохо, что даже из одного потока всё непредсказуемо?

★★★★

Re: python multiprocessing.Queue.empty()

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

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

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

dimon555 ★★★★★ ()
Ответ на: Re: python multiprocessing.Queue.empty() от dimon555

Re: python multiprocessing.Queue.empty()

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

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

Davidov ★★★★ ()
Ответ на: Re: python multiprocessing.Queue.empty() от Davidov

Re: python multiprocessing.Queue.empty()

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 ★★★★ ()
Ответ на: Re: python multiprocessing.Queue.empty() от Davidov

Re: python multiprocessing.Queue.empty()

А так ли тебе нужна Queue из multiprocessing?

"When a process first puts an item on the queue a feeder thread is started which transfers objects from a buffer into the pipe." Это отсюда: http://docs.python.org/library/multiprocessing.html#multiprocessing.Queue

Юзай обычную from Queue import Queue

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