Python 多协程实验时报错 Error: maximum recursion depth exceeded 程序退出代码1073741571

在尝试使用Python进行多协程编程,处理上千个URL时,遇到了'Error: maximum recursion depth exceeded'的问题。尽管了解到Python的递归深度默认限制为1000,尝试解决但未成功,程序异常退出,退出代码1073741571。目前问题尚未解决,寻求解决方案。

在多协程程序代码过程中,试验了一个小项目,获取上千个url中页面,代码如下:

import gevent
from gevent.queue import Queue
import time
import requests

from gevent import monkey#把下面有可能有IO操作的单独做上标记
monkey.patch_all() # 将IO转为异步执行的函数

link_list = []
with open(r'D:\...\alexa.txt', 'r') as file:
    file_list = file.readlines()
    for eachone in file_list:
        link = eachone.split('\t')[1]
        link = link.replace('\n','')
        link_list.append(link)

start = time.time()
def crawler(index):
    Process_id = 'Process-' + str(index)
    while not workQueue.empty():
        url = workQueue.get(timeout=2)
        try:
            r = requests.get(url, timeout=20)
            print (Process_id, workQueue.qsize(), r.status_code, url)
        except Exception as e:
            print (Process_id, workQueue.qsize(), url, 'Error: ', e)

def boss():
    for url in link_list:
        workQueue.put_nowait(url)   #不阻塞地存放消息

if __name__ == '__main__':
    workQueue = Queue(1000)
### Python 中解决递归过深导致的 `RuntimeError: maximum recursion depth exceeded` 问题 在 Python 中,`RuntimeError: maximum recursion depth exceeded` 是由于递归调用的深度超过了系统默认的最大递归限制(通常是 1000)。这种错误通常发生在递归函数没有正确的终止条件或递归层次过深[^1]。 #### 调整递归深度限制 可以通过 `sys.setrecursionlimit` 方法调整 Python 的最大递归深度。以下是一个示例代码: ```python import sys # 查看当前的递归限制 print("当前递归限制:", sys.getrecursionlimit()) # 设置新的递归限制(例如设置为 2000) sys.setrecursionlimit(2000) # 测试递归函数 def recursion_test(num): if num > 3000: # 确保有终止条件 return print(f"当前递归次数: {num}") recursion_test(num + 1) recursion_test(1) ``` 需要注意的是,虽然可以增加递归限制,但过高的递归深度可能导致栈溢出或其他性能问题[^4]。 #### 检查递归终止条件 确保递归函数中包含明确的终止条件。如果递归函数无法正常终止,即使调整了递归限制,程序仍然会崩溃。例如: ```python def factorial(n): if n == 0: # 终止条件 return 1 return n * factorial(n - 1) print(factorial(5)) # 输出结果为 120 ``` #### 使用迭代替代递归 在某些情况下,递归可以被迭代方法替代,从而避免递归深度问题。例如,计算斐波那契数列,可以用循环代替递归: ```python # 使用递归计算斐波那契数列 def fibonacci_recursive(n): if n <= 1: return n return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2) # 使用迭代计算斐波那契数列 def fibonacci_iterative(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b return a print(fibonacci_recursive(10)) # 输出 55 print(fibonacci_iterative(10)) # 输出 55 ``` #### 优化算法设计 对于需要处理大规模数据的递归算法,应考虑优化算法设计以减少递归调用的深度。例如,在爬虫脚本中使用广度优先搜索(BFS),可以借助队列来实现非递归版本的遍历[^2]。 #### 示例:非递归的广度优先搜索 ```python from collections import deque def bfs(graph, start_node): visited = set() queue = deque([start_node]) while queue: node = queue.popleft() if node not in visited: visited.add(node) neighbors = graph[node] queue.extend(neighbors) return visited # 示例图结构 graph = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F'], 'D': [], 'E': ['F'], 'F': [] } print(bfs(graph, 'A')) # 输出 {'A', 'B', 'C', 'D', 'E', 'F'} ``` #### 注意事项 - 增加递归限制可能带来性能问题或内存溢出风险,因此需谨慎使用。 - 在实际开发中,尽量避免深度递归,优先考虑迭代或其他非递归算法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值