Универсальный ThreadPool в.NET

Как уже упоминали другие, сканирование списка не только неэффективно, но и O (n), поэтому чем больше ваш список, тем хуже время поиска.

Здесь у вас есть два списка сканирования, одно неявное (dev_id in dev_exist) и одно явное (for y in fin_list: if dev_id in y[0]:).

Решение состоит в том, чтобы использовать dict (или collections.OrderedDict, если порядок вставки имеет значение) для сохранения дедуплицированного результата, с «id» в качестве ключа и строкой в ​​качестве значения - поиск ключа Dict равен 0 (1) (постоянный время) и очень быстро. Этот диктант также заменит список dev_exist.

Также, учитывая данные вашего примера, вы, вероятно, захотите заменить if 'somestring' in x[i] на if x[i] == 'somestring', что является более точным ('foo' in 'foobar' вернет истину, вероятно, не то, что вы хотите) и (немного) быстрее (в зависимости от строки длина).

def rm_dupl(my_list):
    results = {} # or `collections.OrderedDict`

    for row in my_list:
        prev_row = results.get(row[0])
        if prev_row:
            # if entry exist, we just update the existing entry with 
            # the value of this current row, and not creating a new entry
            # below we update with the duplication one

            val = row[2] # avoids multiple access to `row[2]`
            if val == 'Broadband':
                prev_row[2] += '_Broadband'
                prev_row[6] = row[6]
            elif val == 'IPTV':
                prev_row[2] += '_IPTV'
                prev_row[7] = row[7]
            elif val == 'Voice':
                prev_row[2] += '_Voice'
                prev_row[8] = row[8]

        else:
            # no matching row found, let's add
            # a new one
            results[dev_id] = row

    # and returns the values
    # NB in py3 you'll want `list(results.values())` instead
    return results.values()
5
задан Coral Doe 2 November 2012 в 07:37
поделиться

3 ответа

Это кажется, что Вы говорите об очереди заданий? (и я похожу на clippy...),

Для записи потоки пула потоков должны обычно использоваться для коротких обрабатываемых деталей. Необходимо идеально создать собственные потоки для долговечной очереди. Обратите внимание, что.NET 4.0 может принимать библиотеки CCR/TPL, таким образом, мы получим некоторые встроенные очереди заданий бесплатно - но не трудно записать потоковую очередь заданий. И можно сделать это универсальным, также;-p

Ре вопрос - я предпочитаю полученный подход переменных к передаче состояния в потоки (будьте ими Thread, ThreadPool, или Control.Invoke):

    Thread t = new Thread(() => SomeMethod(arg));
    t.IsBackground = true;
    t.Name = "Worker n";
    t.Start();

Это дает Вам много более тонкой настройки по потоку, не насыщая ThreadPool.

5
ответ дан 18 December 2019 в 14:53
поделиться

Так как это тривиально для упаковки безотносительно состояния, которое Вы любите путем передачи анонимного делегата или лямбды к пулу потоков (через переменное получение), нет никакой потребности в универсальной версии.

Например, Вы могли записать служебную функцию:

static void QueueItem<T>(Action<T> action, T state)
{
    ThreadPool.QueueUserWorkItem(delegate { action(state); });
}

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

7
ответ дан 18 December 2019 в 14:53
поделиться

ThreadPool существует начиная с.NET 1.1, который не имел Дженериков.

Мне нравится, как они приняли решение не повредить назад совместимость :-)

1
ответ дан 18 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

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