django写mysql轮询_数据库的Python/Django轮询有内存

我有一个Python脚本为database和memcache运行Django,但它显然是作为一个独立的守护进程运行的(即不响应webserver请求)。守护进程检查Django模型对带有status=STATUS_NEW的对象的请求,然后将它们标记为工作状态并将它们放入队列中。

许多进程(使用多进程包创建)将从队列中提取内容,并使用传递给队列的pr.id处理请求。我相信内存泄漏可能在下面的代码中(但它可能在队列另一侧的“Worker”代码中,尽管这不太可能,因为即使没有出现任何请求,也会增加内存大小,即当workers都在Queue.get()上阻塞时)。from requisitions.models import Requisition # our Django model

from multiprocessing import Queue

while True:

# Wait for "N"ew requisitions, then pop them into the queue.

for pr in Requisition.objects.all().filter(status=Requisition.STATUS_NEW):

pr.set_status(pr.STATUS_WORKING)

pr.save()

queue.put(pr.id)

time.sleep(settings.DAEMON_POLL_WAIT)

其中settings.DAEMON_POLL_WAIT=0.01。

如果我让它运行一段时间(即几天),Python进程将增长到无限大,最终系统将耗尽内存。

这里发生了什么(或者我怎么知道),更重要的是-你怎么能运行一个守护进程来做这个?

我的第一个想法是改变函数的动态性,特别是将对新请求对象的检查放入一个django.core.cache cache,即from django.core.cache import cache

while True:

time.sleep(settings.DAEMON_POLL_WAIT)

if cache.get('new_requisitions'):

# Possible race condition

cache.clear()

process_new_requisitions(queue)

def process_new_requisitions(queue):

for pr in Requisition.objects.all().filter(status=Requisition.STATUS_NEW):

pr.set_status(pr.STATUS_WORKING)

pr.save()

queue.put(pr.id)

使用status=STATUS_NEW创建申请的进程可以执行cache.set('new_requisitions', 1)(或者,我们可以捕获正在创建新申请的signal或Requisition.save()事件,然后从那里在缓存中设置标志)。

但是,我不确定我在这里提出的解决方案是否解决了内存问题(这可能与垃圾收集有关,因此通过process_new_requisitions的范围界定可以解决这个问题)。

我很感激你的任何想法和反馈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值