Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 2, 2015 09:19:31

wegwgweg
Зарегистрирован: 2015-02-02
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Потокобезопасный список

Пытался сделать список, с которым можно было-бы безопасно работать, при использовании потоков. Получилось, примерно это:

class MyList:
    def __init__(self):
        self.__data = []
        self.__lock = threading.Lock()
    def __len__(self):
        with self.__lock:
            size = len(self.__data)
        return size
    def append(self, p_object):
        with self.__lock:
            self.__data.append(p_object)
    def pop(self, index=None):
        with self.__lock:
            if index:
                p_object = self.__data.pop(index)
            else:
                p_object = self.__data.pop(-1)
            return p_object
    def clear(self):
        with self.__lock:
            self.clear()

Подскажите пожалуйста, все ли я правильно сделал, может я чего-то не учёл?

Отредактировано wegwgweg (Фев. 2, 2015 09:20:09)

Офлайн

#2 Фев. 2, 2015 09:36:31

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Потокобезопасный список

wegwgweg
Подскажите пожалуйста, все ли я правильно сделал, может я чего-то не учёл?
Не учли что операции со списками в питоне и так атомарны



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Фев. 2, 2015 09:48:22

wegwgweg
Зарегистрирован: 2015-02-02
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Потокобезопасный список

PooH
Не учли что операции со списками в питоне
Ну незнаю, везде писали, что нет и в учебниках говорилось, что от версии к версии это может меняться и лучше пользоваться замками.

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

Отредактировано wegwgweg (Фев. 2, 2015 14:06:41)

Офлайн

#4 Фев. 2, 2015 22:46:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Потокобезопасный список

а мне казалось для этого модуль Queue сделали



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Фев. 3, 2015 13:55:25

wegwgweg
Зарегистрирован: 2015-02-02
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Потокобезопасный список

JOHN_16
Про Queue знаю, но нужно чтобы можно было посмотреть сразу все данные (на пример вывести на экран) или в цикле посмотреть все данные и при этом не опустошив список. С очередьми это невозможно, по этому горожу вот такие велосипеды.

Если есть более правильные способы решения проблемы, подскажите.

JOHN_16
Кстати подскажите пожалуйста, действительно, что все действия со списками атамарны и следовательно их можно применять при работе с потоками без опаски?

Отредактировано wegwgweg (Фев. 3, 2015 14:06:34)

Офлайн

#6 Фев. 3, 2015 23:06:46

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Потокобезопасный список

wegwgweg
Простое гугление по запрос Python list atomic operation первой же ссылкой ведет нас на Stack Overflow, где дается ответ, а так же есть сылка на эту заметку, где показаны какие операции являются потоко-безопасными, а какие нет. Вот пример оттуда:

For example, the following operations are all atomic (L, L1, L2 are lists, D, D1, D2 are dicts, x, y are objects, i, j are ints):

L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()

These aren’t:

i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1

Еще можете обратить внимание на класс collections.deque . Он используется за сценой в классе Queue, поддерживает итерационный протокол, поэтому можно пройтись по его содержанию итератором или получить список элементов функцией list. Честно не знаю насколько он подходит. В официальной документации сказано что он потоко-безопасен:
Deques are a generalization of stacks and queues (the name is pronounced “deck” and is short for “double-ended queue”). Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Фев. 4, 2015 05:10:35

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Потокобезопасный список

Что то я засомневался в атомарности. Вот, например, байт код для ls.append

3           15 LOAD_FAST                 0 (ls)
18 LOAD_ATTR 0 (append)
21 LOAD_CONST 4 (4)
24 CALL_FUNCTION 1
27 POP_TOP
налицо пять операций, если только интерпретатор специально не запрещает переключение на каких то из них(это надо в исходниках питона смотреть), то боюсь нет там атомарности.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version