RuntimeError:无法使用ThreadPool和少数线程启动新线程

时间:2018-05-02 08:07:21

标签: python threadpool

我在Python中使用来自ThreadPool的{​​{1}}时,有时会遇到RuntimeError(我会说不超过1%)。

我已经读过如果试图打开数百个线程就会发生这种情况。在我的情况下,它应该是最多4个线程,所以我有点困惑为什么会发生这种情况。

我之前在完全相同的环境multiprocessing.pool中使用了3个线程并且从未出现错误。

我的代码是:

ThreadPool

跟踪:

import time
from multiprocessing.pool import ThreadPool

while True:
    qty_fetched = 6
    time.sleep(random_secs(0.5))
    pending_updates = fetch_pending_updates(qty_fetched) #list of dicts

    if pending_updates:
        prio = pending_updates[0]['prio'] #variable number between 0 and 4 (edited from original question)

        if prio > 3:
            qty_threads = 1

        elif prio == 0 or prio == 1:
            qty_threads = 4

        else:
            qty_threads = 3

        pool = ThreadPool(qty_threads)
        pool.map(self.run_update_NEW, pending_updates) #a list of 6 dicts will be given to the pool of 1, 3 or 4 threads

    else:
        time.sleep(2)

有什么问题的想法是什么?

尝试:

here开始,我了解了... pool = ThreadPool(qty_threads) File "/app/.heroku/python/lib/python3.6/multiprocessing/pool.py", line 789, in __init__ Pool.__init__(self, processes, initializer, initargs) File "/app/.heroku/python/lib/python3.6/multiprocessing/pool.py", line 192, in __init__ self._task_handler.start() File "/app/.heroku/python/lib/python3.6/threading.py", line 846, in start _start_new_thread(self._bootstrap, ()) RuntimeError: can't start new thread

我决定尝试一下:

ThreadPoolExecutor

我会更新帖子,说明这是否有效。

1 个答案:

答案 0 :(得分:1)

我可以在您的代码中看到的一个问题是,您有一个无限while True循环,您可以在其中创建池,但实际上您从未关闭它。你现在继续创建池,但是当你从未关闭并加入池时,“旧”线程很可能只是挂在那里,稍后你会创建更多它们。我的猜测是你最终耗尽资源并在某处达到进程或内核限制。

我会在while循环之外移动池创建,并继续在循环中使用相同的池。这是池的整个想法 - 让进程或线程等待工作出现,在启动重复性任务时消除进程/线程创建开销。

如果有理由重新启动游戏池(我无法弄清楚可能是什么 - 如果您需要偶尔续订工作人员,可以在游泳池声明中使用maxtasksperchild),然后至少关闭老游泳池正确,因为你不会再为它提供任何工作。