我有一个程序应该永远运行。 这是我的做法:
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标准库Queue类似,但它们使用Redis数据库作为后端。
函数process对作业携带的数据进行一些处理(主要是HTML解析),并返回一个字典。
函数post_process通过检查一些标准(因为仅有一个进程可以同时检查标准,所以需要锁定)将作业写入另一个Redis队列。它返回True/False。
程序每天使用的内存正在增加。有人能想出发生了什么吗?
当作业在run方法中退出作用域时,内存应该被释放,对吗?
tracemalloc
,还是在调试器中扫描gc堆,或者只是猜测? - abarnert