chn*_*net 4 python recursion multithreading depth
我使用Python多线程来实现Quicksort.Quicksort是在函数中实现的.它是一个递归函数.每个线程调用Quicksort对它拥有的数组进行排序.每个线程都有自己的数组,用于存储需要排序的数字.如果数组大小较小(<10,000).它运行正常.但是,如果数组大小较大,则显示"最大递归深度超过".所以,我使用setrecursionlimit()函数将递归深度重置为1500.但程序直接崩溃...以下是quicksort代码.如果不在多线程环境中,它可以很好地工作.似乎多线程是递归深度问题的原因.
def partition (array, p, r):
x = array[r]
i = (p-1)
j = p
while (1):
if array[j] <= x:
i = (i+1)
temp = array[j]
array[j] = array[i]
array[i] = temp
j+=1
if j == r:
break
temp = array[i+1]
array[i+1] = array[r]
array[r] = temp
return i+1
def quicksort (array, p, r):
if p < r:
q = partition (array, p, r)
quicksort (array, p, q-1)
quicksort (array, q+1, r)
Run Code Online (Sandbox Code Playgroud)
听起来你真正的问题是"为什么使用线程时递归深度更短"?我会尽力回答这个问题.
首先,背景.每个级别的递归都存储在称为堆栈的内存区域中.不幸的是,系统必须提前分配堆栈空间,并且事先并不知道程序可能需要多少堆栈空间.这就是太多递归导致"最大递归深度"错误的原因:您的程序耗尽了所有的堆栈空间.
每个线程都需要自己的堆栈来存储当前在该线程中执行的函数列表.在单线程程序中,系统可以为该一个线程提供大量内存给堆栈.在多线程程序中,系统必须更加保守,并且每个线程只提供一个小堆栈.否则,具有许多线程的程序可能会快速耗尽所有系统内存,只有堆栈空间(大多数不会被使用).
所有这些都是由操作系统和/或C库完成的,而Python(更确切地说,CPython)运行在C库之上.Python努力阻止您使用整个C堆栈,因为这会导致硬崩溃而不仅仅是异常.您可以告诉Python如何使用该setrecursionlimit函数,但这不会改变可用的实际堆栈空间量.
在具有bash shell的unix-ish系统上,您可以使用该ulimit -s命令更改堆栈大小.help ulimit在bash shell提示符下键入以获取更多信息.