Python线程越来越多地生成任务并消耗太多内存和cpu

时间:2017-08-18 10:33:25

标签: python linux multithreading

我有一个具有特定任务的文件,我需要每1秒运行一次。我编写了下面的程序,并将此文件作为linux中的服务。当我启动服务时,python线程会越来越多地生成任务,这会消耗太多的CPU和内存。因为linux中的最大任务数是有限的,所以在总共任务超出最大值之后,服务将崩溃

  

正如您在此图中所看到的,任务数量随着时间的推移而增加,内存和CPU使用率也非常高!!!

My Service Info

threads = []
def process():
    t = threading.Timer(interval=1, function=process)
    t.start()
    threads.append(t)
    do_task()

if __name__ == '__main__':
    process()

    for thd in threads:
        thd.join()

我的问题:如何限制我的帖子?如何在其他任务运行之前确保没有新任务生成?

2 个答案:

答案 0 :(得分:1)

你在那里写的内容看起来像fork bomb或者至少非常接近它

你的Foo函数不断产生在其中运行相同函数的线程,并且只运行它应该运行的实际作业。这意味着您可以在很短的时间内获得大量的线程。正确方向的快速解决方法是首先完成工作,然后生成另一个线程,如下所示:

process

这里要注意的重要一点是def process(): do_task() t = threading.Timer(interval=1, function=process) t.start() threads.append(t) 在创建任何其他线程之前执行

话虽如此,为什么你需要一个额外的线程来完成手头的工作而不会满足于do_task()

time.sleep

虽然这并不能保证你每秒完成一次工作,但是你的内存占用空间很大,如果工作时间太长你也不会耗尽资源

答案 1 :(得分:0)

这就是我所说的线虫狂。这是一种疯狂。每个衍生的线程都会产生新的线程,这种情况几乎持续不断,导致资源匮乏:

def process():
    t = threading.Timer(interval=1, function=process)
    t.start()
   ...

您基本上正在做的是在指定的时间间隔过后,使用运行process的计时器生成线程。问题是什么时候停止?你可能在os._exit中使用do_task来杀死整个过程,但是极不可能,更糟糕的是,除非你知道自己在做什么,否则不要这样做!我无法分辨。但是,我可以说,你正在制作一个工作线程池来完成任务,这不应该是无法控制的。我已经对您的代码进行了微调:

if __name__ == '__main__': 
    numOfThreads = 10             # 10 threads
    for i in range(numOfThreads):
        t = threading.Timer(interval=1, function=do_task)
        threads.append(t)
        t.start()

   for t in threads:
       t.join()

您混合了代码的某些部分,这些部分应该在生成的线程之外,您生成的线程应该执行阻塞或长时间运行的任务。