Суммирование элементов матрицы с многопоточностью / многопроцессорностью в Python - PullRequest
1 голос
/ 25 сентября 2019

Я новичок в многопроцессорности и многопоточности в Python и пытаюсь решить эту проблему:

Учитывая матрицу тревожности, я должен суммировать все элементы матрицы с многопроцессорностью или многопоточностью (я быхотелось бы увидеть оба решения). Каждый поток должен суммироваться с переменной sumThreads (я не знаю, если с многопроцессорностью это может быть достигнуто).Я должен использовать n процессов / потоков.

Это то, что я до сих пор пробовал с потоками

import threading

matrix = [[1, 2],[3, 4],[5, 6]]

def run(n):
    for i in range(len(matrix[0])):
        sumThreads += matrix[n][i] 

sumThreads = 0
for i in range(len(matrix)):
    t = threading.Thread(target=run, args=(i,))
    t.start() 

print(sumThreads)

Однако я получаю следующую ошибку

UnboundLocalError: local variable 'sumThreads' referenced before assignment

Если я помещу run ниже начальных потоков, это говорит мне, что запуск не определен.

То, что я ожидаю, выглядит примерно так:

sumThreads = 0

matrix = [[1, 2],[3, 4],[5, 6]] #Prints 21

Здесьn = 3 и вывод должен быть 21 с потоком / процессом 1 добавлением 1+2, потоком / процессом 2 добавлением 3+4 и потоком / процессом 3 добавлением 5+6

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Полный код будет

import threading

matrix = [[1, 2],[3, 4],[5, 6]]

def run(n, **totalSum):
    for i in range(len(matrix[0])):
        sumThreads['sumThreads'] += matrix[n][i]

sumThreads = {"sumThreads":0}
for i in range(len(matrix)):
    t = threading.Thread(target=run, args=(i,), kwargs=sumThreads)
    t.start() 
print(sumThreads['sumThreads']) #prints 21

0 голосов
/ 25 сентября 2019

Вам необходимо передать ваш общий объект sumThreads в качестве аргумента ключевого слова или kwarg для потока :

t = threading.Thread(target=run, args=(i,), kwargs={'sumThreads':sumThreads})

Чтобы другие потоки получили к нему доступ, выдолжны поделиться этим с этими темами через kwarg.До этого он был локальным для исходящего потока и поэтому не был доступен для других потоков.Я добавлю это к ответу ниже.

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