python:taskqueue.add()中是否存在内存泄漏?

python:taskqueue.add()中是否存在内存泄漏?,python,google-app-engine,memory-leaks,Python,Google App Engine,Memory Leaks,以下代码添加了对blobstore中的文件执行某些处理的任务,它在B2后端运行,因此没有超时限制: for task in tasks: tools.debug("add_tasks_to_process_files", "adding_task") taskqueue.add(\ name=("Process_%s_files---%s--%s--%s--%s" % \ (len(tasks[task])

以下代码添加了对blobstore中的文件执行某些处理的任务,它在B2后端运行,因此没有超时限制:

for task in tasks:
    tools.debug("add_tasks_to_process_files", "adding_task")

    taskqueue.add(\
            name=("Process_%s_files---%s--%s--%s--%s" % \
                        (len(tasks[task]), task[1], task[0], task[2], int(time.time()))),\
            queue_name="files-processor",\
            url="/analytics/process_files/",\
            params={"processing_task": json.dumps({"profile": task, "blobs_to_process": tasks[task]})})
tasks是以下形式的词典:

{
    (x1,y1,z1): ["blob_key", "blob_key"... (limited to 35 keys)],
    (x2,y2,z2): ["blob_key", "blob_key"...],
    .
    .
    .
}
x1、y1、z1都是字符串

tools.debug是我编写的一个函数,它使用urlfetch将消息发送到本地服务器(因此我不必等待20分钟就能读取日志):

由于tools.debug首次失败时不在代码中,因此我确信这不是内存问题的原因

我得到了这个错误:

   /add_tasks_to_process_files/ 500 98812ms 0kb instance=0 AppEngine-Google; (+http://code.google.com/appengine):
    A serious problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may have a memory leak in your application. (Error code 201)
紧接着:

/_ah/stop 500 110ms 0kb
Exceeded soft private memory limit with 283.406 MB after servicing 1 requests total
同样,我收到的是上面代码中没有一行的代码:
tools.debug(“add\u tasks\u to\u process\u files”,“adding\u task”)

现在,让我向您展示我在调试器中看到的内容:

1 2012-1-19 14:41:38 [processors-backend] processors-backend-initiated instance_id: 1329662498, memory: 18.05078125, backend_instance_url: http://0.processors.razoss-dock-dev.appspot.com, backend_load_balancer_url: http://processors.razoss-dock-dev.appspot.com
2 2012-1-19 14:41:39 [AddTasksToProcessFiles] start instance_id: 1329662498, files_sent_to_processing_already_in_previous_failed_attempts: 0, memory: 19.3828125
3 2012-1-19 14:41:59 [AddTasksToProcessFiles] add_tasks_to_process_files-LOOP_END total_tasks_to_add: 9180, total_files_added_to_tasks: 9184, task_monitor.files_sent_to_processing: 0, total_files_on_tasks_dict: 9184, instance_id: 1329662498, memory: 56.52734375
4 2012-1-19 14:42:0 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.81640625
5 2012-1-19 14:42:0 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.81640625
6 2012-1-19 14:42:1 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.9375
7 2012-1-19 14:42:2 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 57.9375
8 2012-1-19 14:42:2 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 58.03125
.
.
.
2183 2012-1-19 14:53:45 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 280.66015625
2184 2012-1-19 14:53:45 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 280.66015625
2185 2012-1-19 14:53:45 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.0
2    186 2012-1-19 14:53:46 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.0
2187 2012-1-19 14:53:46 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.0
2188 2012-1-19 14:53:46 [add_tasks_to_process_files] adding_task instance_id: 1329662498, memory: 281.3828125
完整跟踪:

taskqueue.add()中是否存在内存泄漏


谢谢

虽然这并不能回答您的特定问题,但您是否尝试过批量添加任务

一次最多可以添加100个任务

未经测试的代码

queue = taskqueue.Queue(name="files-processor")
while tasks:
    queue.add(taskqueue.Task(...) for k,v in (tasks.popitem() for _ in range(min(len(tasks),100))))

如果您仍想在其他地方使用
任务
,则必须稍微更改此结构(或复制)。

如何评估内存使用情况?如果从任务中删除blobstore api调用,您是否有类似的内存使用模式?Hi-proppy:我找到了原因:appstats已启用。。。无论如何,谢谢用这个替换原始代码为我们解决了问题(它现在适用于我们想要支持的最大负载)。可能是因为对queue.add的调用较少。我没有尝试查看是否发送x100多个任务会导致最初的问题:缺少时间,并且我们没有计划我们的负载来生成这么多的任务。。。谢谢!还有一个问题:您决定使用range()而不是xrange()有什么原因吗?@theosp:老实说,我本来就在想这个问题:)对于这么小的列表,实际上没有什么区别,但您是对的,xrange是另一个微小的改进。太好了,它对你有用!
queue = taskqueue.Queue(name="files-processor")
while tasks:
    queue.add(taskqueue.Task(...) for k,v in (tasks.popitem() for _ in range(min(len(tasks),100))))