【发布时间】:2019-04-14 04:01:24
【问题描述】:
我是 Python 新手,一直在尝试使用多线程。已经有一个关于这个话题的深入的comment on Stackoverflow,但我还有一些问题。
我的程序的目标是创建和填充一个数组(虽然我猜在技术上它必须在 Python 中称为“列表”)并通过“分而治之”算法对其进行排序。不幸的是,许多用户似乎将术语“列表”和“数组”混为一谈,尽管它们并不相同。如果我的评论中使用了“数组”,请记住我发布了来自各种资源的不同代码,并且为了尊重原作者,没有更改其内容。
我用于填充列表 count 的代码非常简单
#!/usr/bin/env python3
count = []
i = 149
while i >= 0:
count.append(i)
print(i)
i -= 1
之后我在“分而治之”的主题上使用this very handy guide 创建了两个用于排序的列表,稍后将它们合并。我现在主要关心的是如何在多线程中正确使用这些列表。
在earlier mentioned post 中有人认为,基本上只需要几行代码就可以使用多线程:
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
还有
results = pool.starmap(function, zip(list_a, list_b))
传递多个列表。
我尝试修改代码但失败了。我的函数的参数是def merge(count, l, m, r)(用于将列表count分为左右两部分),两个临时创建的列表分别称为L和R。
def merge(arr, l, m, r):
n1 = m - l + 1
n2 = r- m
# create temp arrays
L = [0] * (n1)
R = [0] * (n2)
但每次我运行程序时,它都会返回以下错误消息:
Traceback (most recent call last):
File "./DaCcountdownTEST.py", line 71, in <module>
results = pool.starmap(merge,zip(L,R))
NameError: name 'L' is not defined
我不知道问题的原因。
非常感谢任何帮助!
【问题讨论】:
-
听起来好像无论在哪里执行
results = pool.starmap(merge,zip(L,R))语句,都没有定义L变量。 -
我认为您的代码可能存在许多问题。但眼前的问题似乎是
L和R是在merge的范围内定义的,但您却试图在未定义的外部范围内使用它们。 -
感谢您的帮助。正如你们俩所说,这可能是我错过的范围问题。由于我是 python 新手,我可能无意中弄乱了缩进。那好吧。考虑到“问题的数量”,我不敢苟同。用于填充列表的代码有效,我已经尝试过了,它完成了它应该做的事情。我从 GeeksForGeeks 复制粘贴的其余代码,它也应该可以工作。所以我认为,正如他们所说,这是一个“第 8 层问题”。因此,我将不得不深入研究代码,直到找到问题的根源。
-
顺便感谢 martineau 的编辑。
标签: python python-3.x multithreading python-multithreading