Скажем, у меня есть исполнитель пула потоков с макс. 10 потоков, и я отправляю ему задачу, которая сама создает другую задачу и, в свою очередь, рекурсивно ожидает ее завершения, пока я не достигну глубины 11.
Пример кода на Python:
import concurrent.futures
e = concurrent.futures.ThreadPoolExecutor(max_workers=10)
def task(depth):
print 'started depth %d' % (depth, )
if depth > 10:
return depth
else:
f = e.submit(task, depth + 1)
concurrent.futures.wait([f])
f = e.submit(task, 0)
print f.result()
Приведенный выше код выводит:
started depth 0
started depth 1
started depth 2
started depth 3
started depth 4
started depth 5
started depth 6
started depth 7
started depth 8
started depth 9
и тупики.
Есть ли способ решить эту проблему без создания дополнительных потоков и исполнителей?
Другими словами, как рабочие потоки могут работать над другими задачами во время ожидания?