我有一个具有特定任务的文件,我需要每1秒运行一次。我编写了下面的程序,并将此文件作为linux中的服务。当我启动服务时,python线程会越来越多地生成任务,这会消耗太多的CPU和内存。因为linux中的最大任务数是有限的,所以在总共任务超出最大值之后,服务将崩溃
正如您在此图中所看到的,任务数量随着时间的推移而增加,内存和CPU使用率也非常高!!!
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()
我的问题:如何限制我的帖子?如何在其他任务运行之前确保没有新任务生成?
答案 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()
您混合了代码的某些部分,这些部分应该在生成的线程之外,您生成的线程应该执行阻塞或长时间运行的任务。