Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多线程与分治结合使用?_Python_Python 3.x_Multithreading_Python Multithreading - Fatal编程技术网

Python 如何将多线程与分治结合使用?

Python 如何将多线程与分治结合使用?,python,python-3.x,multithreading,python-multithreading,Python,Python 3.x,Multithreading,Python Multithreading,我是Python新手,一直在尝试使用多线程。关于这个话题已经有了深入的讨论,但我仍然有一些问题 我的程序的目标是创建和填充一个数组(虽然我猜从技术上讲,它必须在Python中称为“列表”),并通过“分而治之”算法对其进行排序。不幸的是,“列表”和“数组”这两个术语似乎被许多用户混淆了,尽管它们并不相同。如果我的评论中使用了“数组”,请记住,我已经发布了不同资源的不同代码,并且为了尊重原作者,没有更改其内容 我填充列表count的代码非常简单 #!/usr/bin/env python3 coun

我是Python新手,一直在尝试使用多线程。关于这个话题已经有了深入的讨论,但我仍然有一些问题

我的程序的目标是创建和填充一个数组(虽然我猜从技术上讲,它必须在Python中称为“列表”),并通过“分而治之”算法对其进行排序。不幸的是,“列表”和“数组”这两个术语似乎被许多用户混淆了,尽管它们并不相同。如果我的评论中使用了“数组”,请记住,我已经发布了不同资源的不同代码,并且为了尊重原作者,没有更改其内容

我填充列表
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]