У меня есть дерево с числом узлов (около 20-25).Я использую ThreadPool для выполнения метода запуска всех узлов в режиме BFS, то есть не все узлы, вызываемые одновременно, только узлы на этом уровне глубины в дереве.
У меня есть не более 10 таких деревьев, которые всеЗапустите одновременно, чтобы выполнить метод запуска ниже, используя потоки.Я использую ThreadPool с 4 потоками.Это означает, что в каждой точке мой процесс имеет около 10 * 4 + 20 (другие потоки, которые я мог бы запустить), которые выполняются, грубо говоря.В любом случае, не близко к тысячам.
Но я все еще время от времени получаю:
pool = ThreadPool(self.number_of_threads)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 732, in __init__
Pool.__init__(self, processes, initializer, initargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 161, in __init__
self._repopulate_pool()
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 225, in _repopulate_pool
w.start()
File "/usr/lib64/python2.7/multiprocessing/dummy/__init__.py", line 75, in start
threading.Thread.start(self)
File "/usr/lib64/python2.7/threading.py", line 739, in start
_start_new_thread(self.__bootstrap, ())
error: can't start new thread
И это мой метод запуска:
def run(self):
"""
Run all TreeNode's of the this ThreadedTree using ThreadPool.
Iterate over all TreeNode's of this ThreadedTree level by level and invoke the run method.
:return: None.
"""
nodes = self.roots
while nodes:
pool = ThreadPool(4)
rc = sum(pool.map(self.__run_node, [node.name for node in nodes]))
_nodes = []
for node in nodes:
_nodes.extend(node.get_children())
nodes = _nodes
Из исследования этогоЯ понимаю, что я могу столкнуться с каким-то лимитом процесса на Python, сколько потоков я могу открыть.Но если он не отличается от предела ОС (в моем случае я работаю на Fedora27, и у меня 95648), тогда я не понимаю, как я могу достичь этого предела.