Список одновременного удаления и добавления

Примечание. В последних версиях matplotlib (> = 1.5) _get_lines изменилось. Теперь вам нужно использовать next(ax._get_lines.prop_cycler)['color'] в Python 2 или 3 (или ax._get_lines.prop_cycler.next()['color'] в Python 2 ), чтобы получить следующий цвет из цветового цикла.

По возможности используйте более прямой подход, показанный в нижней части ответа @ joe-kington. Поскольку _get_lines не обращен к API, в будущем он может снова измениться в обратном порядке.

13
задан abatishchev 22 October 2012 в 12:56
поделиться

4 ответа

Да, добавление и удаление элементов из List <> не является потокобезопасным, поэтому вам необходимо синхронизировать доступ, например, с помощью блокировки .

Помните, что ключевое слово lock никоим образом не блокирует объект, который вы используете в качестве идентификатора, оно только предотвращает одновременный ввод двух потоков в один и тот же блок кода. Вам потребуется заблокировать весь код, который обращается к списку, используя тот же объект в качестве идентификатора.

29
ответ дан 1 December 2019 в 19:50
поделиться

Использование блокировки для определенного кода делает его потокобезопасным, но я не согласен с этим для текущего сценария.

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

Другой чисто программный подход упоминается в этой ссылке , хотя я никогда не тестировал его собственноручно, но он должен работать.

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

Я беру свой ответ. Использование блокировок лучше, чем использование этого метода.

-1
ответ дан 1 December 2019 в 19:50
поделиться

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

2
ответ дан 1 December 2019 в 19:50
поделиться

На самом деле, иногда List <> является потокобезопасным, а иногда нет, согласно Microsoft :

Открытые статические члены этого типа потокобезопасный. Любые члены экземпляра не гарантируется потокобезопасность.

но на этой странице говорится:

Перечисление через коллекцию по сути не является потокобезопасным процедура. В том редком случае, когда перечисление соперничает с одним или несколькими доступ на запись, единственный способ гарантировать безопасность потока заключается в блокировке сбор в течение всего перечисление. Разрешить сбор доступ к нескольким потокам для чтение и письмо, вы должны реализовать собственную синхронизацию.

-1
ответ дан 1 December 2019 в 19:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: