【问题标题】:Sum elements of matrix with multithreading/multiprocessing in Python在Python中使用多线程/多处理对矩阵元素求和
【发布时间】:2019-09-25 01:44:11
【问题描述】:

我是 Python 中多处理和多线程的新手,我正在尝试解决这个问题:

给定一个 n x m 矩阵,我必须将矩阵的所有元素与多处理或线程相加(我希望看到这两种解决方案)。 每个线程必须对一个变量求和 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

【问题讨论】:

  • 传入sumThreads 作为线程的kwarg。
  • 您可以使用queue 来收集结果,该结果也可以用于多处理。
  • @MyNameIsCaleb 谢谢,我已经尝试将 sumThreads 传递给 kwarg。但是,我不知道它为什么会起作用。为什么我不能将SumThreads 作为int 传递?
  • 为了让其他线程访问它,您必须通过 kwarg(关键字参数)将其共享给这些线程。在此之前,它对原始线程是本地的,因此对其他线程不可用。我会将其添加到下面的答案中。
  • 请投票并点击旁边的复选标记以关闭此问题。

标签: python multithreading matrix multiprocessing


【解决方案1】:

您需要传入您的共享对象sumThreads 作为关键字参数或thread 的kwarg:

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

为了让其他线程访问它,您必须通过 kwarg 将它共享给那些线程。在此之前,它对原始线程是本地的,因此对其他线程不可用。我会将其添加到下面的答案中。

【讨论】:

    【解决方案2】:

    完整的代码是

    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
    
    

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 2019-08-24
      • 2021-06-28
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多