Является ли это deque потокобезопасным в Python? - PullRequest
9 голосов
/ 18 декабря 2011

Я не могу решить, является ли следующий deque потокобезопасным.
Короче говоря, я создал класс с deque, который отображает его содержимое каждые 1 секунду в новом потоке (чтобы он не останавливал основную программу во время печати).
Дек заполняется из основного потока, поэтому в принципе ДОЛЖНА быть вероятность столкновения.
ОДНАКО, deque заполняется с помощью метода класса, так что по сути к нему обращаются из самого экземпляра, следовательно, из того же потока.
Вот упрощенный код:

import threading
import time
from collections import deque

class MyQueue(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.q = deque()
        self.start()

    def run(self):
        # pop out queue items every 1 sec
        # (please ignore empty deque for now)
        while True:
            print self.q.popleft()
            time.sleep(1)

    def add_to_q(self, val):
        # this function is called from outside
        self.q.append(val)

# main
# fill the queue with values
qu = MyQueue()
for i in range(1:100):
    qu.add_to_q(i)

Итак, хотя добавление и удаление элементов из очереди происходит внутри экземпляра, существует ли риск из-за того, что функция добавления вызывается извне экземпляра?

EDIT:
Так как мне нужно изменить предметы в моем deque, я должен был использовать Deque. Что я делаю, так это: roatate () для данного элемента, вытащить его, изменить, задвинуть обратно и повернуть () обратно в исходное положение.
Если я не найду способ реализовать изменения в очереди, мне придется придерживаться Deque

Ответы [ 3 ]

16 голосов
/ 18 декабря 2011

Deque является поточно-ориентированным (http://docs.python.org/library/collections.html#deque-objects) для добавления и всплытия с противоположных сторон. Ниже в документах упоминается только то, что append () и popleft () являются поточно-ориентированными.

Существует поточно-ориентированная реализация самой очереди. Поэтому вы должны использовать его, если у вас нет каких-то странных требований.

3 голосов
/ 12 декабря 2015

Для информации есть билет Python, на который ссылаются для безопасности потоков deque (https://bugs.python.org/issue15329).

Заголовок «разъяснить, какие методы deque являются потокобезопасными», нижняя строка:

Операции deque's append (), appendleft (), pop (), popleft () и len (d) являются поточно-ориентированными в CPython. Методы добавления имеют в конце DECREF (для случаев, когда установлен maxlen), но это происходит после того, как все обновления структуры были сделаны и инварианты были восстановлены, поэтому вполне нормально рассматривать эти операции как атомарные.

В любом случае, если вы не уверены на 100% иВы предпочитаете надежность, а не производительность, просто установите блокировку «Нравится» для print self.q.popleft() и self.q.append(val);)

0 голосов
/ 18 декабря 2011

Модуль Queue может быть полезен для вас: http://docs.python.org/library/queue.html

...