我有以下代码在一段时间内正常运行但最终因“超出最大递归深度”错误而失败:
def getImg(data):
if data and len(data) > 0:
for entry in data:
print " -- Entry name", entry[‘url’]
# eventually grab an img using the entry[‘url’] data
time.sleep(6)
else:
print “no entry”
offset = offset + 1
queryDb(offset)
def queryDb(offset):
offset = str(offset)
cur.execute("SELECT name FROM mutable OFFSET " + offset + " LIMIT 1");
result = cur.fetchone()
id = result[0]
url="http://localhost:8080/?query=" + id
r=requests.get(url)
getImg(json.loads(r.content), artistName, gid)
queryDb(0)
代码基本上是使用递增偏移量在数据库表上循环。然后调用getImg
,它将从网站中检索一些图像(如数据中指定的那样),然后使用增加的索引再次调用queryDb
。数据中可能有多个条目,并且网站具有速率限制(因此是睡眠),因此最佳方式似乎是让循环在每次调用之间以睡眠运行并且一旦完成然后再次调用queryDb。
问题是这会导致递归错误。
在避免递归问题的同时,有什么更好的方法可以做到这一点?
答案 0 :(得分:2)
您可以在queryDb
中使用for循环,不要在getImg
中调用queryDb:
def queryDb():
cur.execute("SELECT name FROM mutable");
result = cur.fetchall()
for row in result:
id = row[0]
url="http://localhost:8080/?query=" + id
r=requests.get(url)
getImg(json.loads(r.content), artistName, gid)
答案 1 :(得分:1)
每次调用getImg
时,您都会增加一次计数器,这意味着每次调用queryDb
时都会增加一次。那么为什么不在循环中做到这一点:
def getImg(data):
if data and len(data) > 0:
for entry in data:
print " -- Entry name", entry['url']
# eventually grab an img using the entry['url'] data
time.sleep(6)
else:
print “no entry”
def queryDb(offset):
offset = str(offset)
cur.execute("SELECT name FROM mutable OFFSET " + offset + " LIMIT 1");
result = cur.fetchone()
id = result[0]
url="http://localhost:8080/?query=" + id
r=requests.get(url)
getImg(json.loads(r.content), artistName, gid)
offset = 0
while True:
queryDb(offset)
offset = offset + 1
这只是从getImg
删除了递归调用,并将整个事件放在一个循环中。它没有解决代码中的任何其他问题,例如如何构造数据库查询。