【发布时间】:2014-11-06 07:47:50
【问题描述】:
我有一个应该永远运行的程序。 这是我正在做的事情:
from myfuncs import do, process
class Worker(multiprocessing.Process):
def __init__(self, lock):
multiprocesing.Process.__init__(self)
self.lock = lock
self.queue = Redis(..) # this is a redis based queue
self.res_queue = Redis(...)
def run():
while True:
job = self.queue.get(block=True)
job.results = process(job)
with self.lock:
post_process(self.res_queue, job)
def main():
lock = multiprocessing.Semaphore(1)
ps = [Worker(lock) for _ in xrange(4)]
[p.start() for p in ps]
[p.join() for p in ps]
self.queue 和 self.res_queue 是两个像 python stdlib Queue 一样工作的对象,但它们 使用 Redis 数据库作为后端。
函数进程对job携带的数据(主要是html解析)和返回的数据做一些处理 一本字典。
函数 post_process 通过检查某些条件将作业写入另一个 redis 队列(一次只有一个进程可以检查导致锁定的条件)。它返回真/假。
程序每天使用的内存在增加。 有人能弄清楚发生了什么吗?
当作业超出运行方法的范围时,内存应该是空闲的吗?
【问题讨论】:
-
是什么让您确定保留的是作业对象?你是用
tracemalloc,还是在调试器中扫描gc堆,还是只是猜测? -
现在只是猜测
标签: python memory multiprocessing