Python gevent线程不释放内存

时间:2015-07-14 08:34:59

标签: python multithreading gevent

我正在使用gevent.monkey.patch_all()然后导入线程。

从线程我导入Thread并创建一个新的线程:

{ sequence: [
   [{column:3},{column:1}],
   [{column:3}]
}

然后我多次执行此代码路径,我可以看到内存增长,永远不会被释放。释放可能需要几个小时才能完成。

但是,如果我直接做     处理器(参数) 我的内存没有增加。

我需要杀死一些线程吗?还是停下来?

由于

1 个答案:

答案 0 :(得分:0)

如果我告诉你,我认为你想在background处执行一些任务并定期执行或在整个生命周期内执行事件。启动此后台任务的过程也存在于内存中吗?

您可以使用gevent.spwan来实现此目的。这是实际的co-routine

background.py: -

import gevent
import gevent.monkey
import datetime
import time

gevent.monkey.patch_all()


def my_task(*args, **kwargs):
    with open("/tmp/test.log", "a+") as f:
        f.write("time: {}\n".format(datetime.datetime.now()))

def exec_background(task, *args, **kwargs):
    """
    Run Your `task` background with given `args` and `kwargs`.
    """
    def run_periodically(*args, **kwargs):
        while 1:
            gevent.sleep(1)
            task(*args, **kwargs)
    return gevent.spawn(run_periodically, *args, **kwargs)

if __name__ == "__main__":
    exec_background(my_task)
    print "Waiting... Do other stuffs here !"
    time.sleep(100)

通过这种方式,您可以重复使用exec_background方法将不同的任务放在后台。

$ python background.py

Waiting... Do other stuffs here !

检查文件tail -f /tmp/test.log您可以看到内容附加在后台。

关于你的超量内存使用情况,我认为它主要与你的任务有关。您可能正在进行大量的网络操作,因此请确保正确清理内容。 Python内存管理器大部分时间都在进行垃圾收集,因此我认为没有任何问题。

检查应用程序整个生命周期的任务逻辑,以及累积某些资源(如套接字或某些对象)的可能性。使用Python上下文管理器:)。

希望这会对你有所帮助。