Python 如何将多线程与分治结合使用?
我是Python新手,一直在尝试使用多线程。关于这个话题已经有了深入的讨论,但我仍然有一些问题 我的程序的目标是创建和填充一个数组(虽然我猜从技术上讲,它必须在Python中称为“列表”),并通过“分而治之”算法对其进行排序。不幸的是,“列表”和“数组”这两个术语似乎被许多用户混淆了,尽管它们并不相同。如果我的评论中使用了“数组”,请记住,我已经发布了不同资源的不同代码,并且为了尊重原作者,没有更改其内容 我填充列表Python 如何将多线程与分治结合使用?,python,python-3.x,multithreading,python-multithreading,Python,Python 3.x,Multithreading,Python Multithreading,我是Python新手,一直在尝试使用多线程。关于这个话题已经有了深入的讨论,但我仍然有一些问题 我的程序的目标是创建和填充一个数组(虽然我猜从技术上讲,它必须在Python中称为“列表”),并通过“分而治之”算法对其进行排序。不幸的是,“列表”和“数组”这两个术语似乎被许多用户混淆了,尽管它们并不相同。如果我的评论中使用了“数组”,请记住,我已经发布了不同资源的不同代码,并且为了尊重原作者,没有更改其内容 我填充列表count的代码非常简单 #!/usr/bin/env python3 coun
count
的代码非常简单
#!/usr/bin/env python3
count = []
i = 149
while i >= 0:
count.append(i)
print(i)
i -= 1
之后,我在“分而治之”的主题中创建了两个用于排序的列表,这些列表后来被合并。我现在主要关心的是如何通过多线程正确使用这些列表
在本书中,有人认为,基本上,使用多线程只需要几行代码:
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)
但每次我运行程序时,它只会响应以下错误消息:
回溯(最近一次呼叫最后一次):
文件“/daccountdownstest.py”,第71行,在
结果=pool.starmap(合并,压缩(L,R))
名称错误:未定义名称“L”
我不知道我的问题的原因
非常感谢您的帮助 我不确定您的代码到底出了什么问题,但下面是多线程版本的完整工作示例: 将生成以下输出:
[93 56 55 60 0 28 17 77 84 2]
[ 0 2 17 28 55 56 60 77 84 93]
遗憾的是,它看起来确实比单线程版本慢了很多。但是,在Python中,当涉及到多线程计算绑定任务时,这种速度会减慢。听起来好像无论在哪里执行
results=pool.starmap(merge,zip(L,R))
语句,都没有定义L
变量。我认为您的代码可能有很多问题。但眼前的问题似乎是L
和R
是在merge
的范围内定义的,但您试图在未定义它们的外部范围内使用它们。谢谢您的帮助。正如你们两位所说,这可能是我错过的一个范围问题。由于我是python新手,我可能无意中弄乱了缩进。哦,好吧。考虑到“问题的数量”,我不敢苟同。用于填充列表的代码是有效的,我已经尝试过了,它完成了它应该做的事情。我复制的其余代码是从Geeksforgeks粘贴的,它也应该可以工作。所以我认为,正如他们所说,这是一个“第8层问题”。因此,我将不得不开始认真研究我的代码,直到找到问题的根源。顺便说一句,谢谢martineau的编辑。谢谢你的回答。这正是我使用的代码。我复制粘贴它,看看它是否符合我的要求。但我得到了一个错误代码。我很确定这一定是我的错,可能是我遗漏了什么,最终像用户tel建议的那样出现了范围问题。考虑到它的速度很慢,我想那应该是GIL。稍后我将不得不处理这个问题,但目前我主要感兴趣的是让它启动并运行。我已经复制并粘贴了代码,它可以工作了。所以我真的很笨拙。我可能应该早点睡觉。再次感谢你的帮助——现在我将有我想要(和需要)的所有时间来对付那个讨厌的小吉尔。
arr = np.random.randint(0,100,10)
print(arr)
mergeSort(arr)
print(arr)
[93 56 55 60 0 28 17 77 84 2]
[ 0 2 17 28 55 56 60 77 84 93]