@Sushkov
">alert("yohoho")

Как сделать многопоточный перебор массива?

Как из списка значений правильно считывать строки, чтобы какой нибудь запоздалый поток не перезаписал указатель на старое значение и по 100 раз не делать одно и тоже?
  • Вопрос задан
  • 1284 просмотра
Пригласить эксперта
Ответы на вопрос 2
@lega
В питоне многопоточный перебор массива будет медленнее чем однопоточный (GIL).

Можно раскидать по процессам, но это уже будет не общий массив, а у каждого свой, либо использовать redis и т.п. + процессы, либо использовать C-расширения/либы на них GIL не влияет*.
Ответ написан
Комментировать
@Andy_U
Вот, например, суммирование элементов массива в несколько процессов (и без всяких C-расширений) :

# -*- coding: utf-8 -*-

import numpy
import multiprocessing


def sub_sum(z):
    return numpy.sum(z)


def parallel_sum(values, cpuz):

    boundaries = [i for i in range(0, len(values), len(values)//cpuz)]
    boundaries[-1] = len(values)

    with multiprocessing.Pool(cpuz) as pool:
        rc = pool.starmap(sub_sum, [(values[c1:c2],) for c1, c2 in zip(boundaries[: -1], boundaries[1:])])

    return sum(rc)


if __name__ == '__main__':

    cpuz = multiprocessing.cpu_count()
    n = 999
    values = numpy.array([i for i in range(n)])

    print('cpuz =', cpuz)
    print('sum =', parallel_sum(values, cpuz))
    print('sum =', n*(n-1)//2)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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