Параллелизм: расширения Python записаны в C/C++, затронутом Глобальной Блокировкой Интерпретатора?

Вам нужно включить группировку следующим образом:

    myListView.IsGroupingEnabled = true;
    myListView.GroupDisplayBinding = new Binding("GroupKey"); // See below

И затем добавить свои данные в группы (например, списки списков). Это часто означает, что вам нужно создать свой собственный класс, чтобы показать свои группы, например:

    public class Grouping : ObservableCollection
    {
        // NB: This is the GroupDisplayBinding above for displaying the header
        public K GroupKey { get; private set; } 

        public Grouping(K key, IEnumerable items)ac
        {
            GroupKey = key;
            foreach (var item in items)
                this.Items.Add(item);
        }
    }

И, наконец, добавьте свои данные в группы:

    var groups = new ObservableCollection>();

    // You can just pass a set of data in (where "GroupA" is an enumerable set)
    groups.Add(new Grouping("GroupA", GroupA)); 

    // Or filter down a set of data
    groups.Add(new Grouping("GroupB", 
        MyItems.Where(a => a.SomeFilter())));

    myListView.ItemSource = groups;

Привяжите свою ячейку в MyDataClass, как и раньше:

    var cell = new DataTemplate(typeof(TextCell));
    cell.SetBinding(TextCell.TextProperty, "SomePropertyFromMyDataClass");
    cell.SetBinding(TextCell.DetailProperty, "OtherPropertyFromMyDataClass");
    myListView.ItemTemplate = cell;

Подключитесь к ссылке в ответе @ pnavk. Обратите внимание на то, почему использовать шаблон K вместо строки в классе Grouping, как настроить внешний вид заголовка и многое другое: http://motzcod.es/post/94643411707/enhancing- xamarinforms-ListView-с группировкой

23
задан Carl Seleborg 16 March 2009 в 16:02
поделиться

3 ответа

Расширения C/C++ Python не связываются GIL. Однако действительно необходимо знать то, что Вы делаете. С http://docs.python.org/c-api/init.html :

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

, Почему я продолжаю так много детали об этом? Поскольку, когда потоки создаются из C, они, don’t имеют глобальную блокировку интерпретатора, и при этом нет структуры данных состояния потока для них. Такие потоки должны загрузить себя в существование, первым созданием структуры данных состояния потока, затем получением блокировки и наконец хранением их указателя состояния потока, прежде чем они смогут начать использовать API Python/C. Когда они сделаны, они должны сбросить указатель состояния потока, выпустить блокировку и наконец освободить их структуру данных состояния потока.

8
ответ дан Ted Dziuba 29 November 2019 в 02:39
поделиться

Да, призывает к расширениям C (C, стандартные программы, названные из Python), все еще подвергаются GIL.

Однако можно вручную выпустить GIL в расширении C, пока Вы стараетесь подтвердить его перед возвращением управления к VM Python.

Для получения информации смотрите на Py_BEGIN_ALLOW_THREADS и Py_END_ALLOW_THREADS макросы: http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

20
ответ дан 29 November 2019 в 02:39
поделиться

Извлеките Cython, он имеет синтаксис, аналогичный Python, но с несколькими конструкциями, такими как "cdef", функции быстрого быстрого доступа и заявление «с ногилом» (которое делает то, что говорит).

0
ответ дан 29 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

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