Изменить переменные в многопроцессорной очереди

Есть ли способ изменить значения после того, как они были помещены в очередь? Например, если у меня есть очередь, в которой есть пара переменных, могу ли я суммировать первую переменную с каким-либо другим значением, которого нет в очереди? Лучше всего сделать это примерно так:

x = queue.get()
queue.put(x+some_value)

Или есть способ сделать это без предварительного удаления объекта из очереди?


person user1423020    schedule 11.07.2012    source источник
comment
есть ли конкретная причина, по которой вам нужно использовать очередь? почему бы вместо этого не использовать список, тогда вы можете легко изменить значения на месте.   -  person EEP    schedule 12.07.2012


Ответы (2)


Вероятно, вам нужны общие значения, такие как multiprocessing.Value, multiprocessing.Array, а не queue. Очередь этого не позволяет.

person jfs    schedule 11.07.2012

Очередь не разрешает доступ таким образом; вы запрашиваете прямой доступ к объекту, который все еще находится в очереди, что противоречит цели очереди.

Я думаю, что вы, возможно, ищете объект deque для использования вместо очереди (читайте об этом здесь: http://docs.python.org/library/collections.html#collections.deque)

Объект deque является потокобезопасным и может вести себя как очередь, при этом разрешая доступ напрямую к своим членам со значением индекса. Однако это медленнее для произвольного доступа, если вы не обращаетесь к левому или правому концу двухсторонней очереди, поэтому, если я правильно понял ваш вопрос, это не должно быть проблемой в вашем случае.

Однако если у вас много случайных обращений к двухсторонней очереди, просто используйте вместо этого multiprocessing.array.

person Atra Azami    schedule 11.07.2012
comment
Я не уверен, что понимаю, что вы имеете в виду. Если он выполняется в разных процессах, адресное пространство не будет совместно использоваться, и поэтому нет причин для беспокойства. Кроме того, что касается вашего исходного вопроса, я понял, что Queue () имеет внутреннюю очередь Queue (). Queue, которая по сути является объектом deque, который вы можете использовать для доступа к очереди так, как вы описали в своем исходном вопросе. Однако это не рекомендуется; подробнее об этом читайте здесь: stackoverflow.com/ questions / 717148 / - person Atra Azami; 12.07.2012