0
0 комментариев

Обнаружил следующее:

import requests
from requests_futures.sessions import FuturesSession
from concurrent.futures import ThreadPoolExecutor
XML = '<TAG>bla</TAG>'
res = []
for i in range(150):
    session = FuturesSession()
    res.append(session.post(u'http://192.168.1.100:9000/Service/rest/BlaValidation', headers={}, data=XML))
for j in range(150):
    res[j].result()
res = []
print(threading.active_count())

В результате, несмотря на то, что объект сессии, объекты возвратов, а также все объекты из futures уничтожены, на экран выведется 151, т.е. 150 потоков, порожденных в результате работы (и да, их породится 150, т.е. каждая новая сессия будет создавать поток!).
Возможно ли это как-то пофиксить?

Если я заменяю формирование сессии следующим образом:

session = FuturesSession(executor=ThreadPoolExecutor(max_workers=12))

Потоков все равно будет 151. По понятной причине. Единственный способ ограничить количество потоков — это вынести формирование сессии вне цикла, тогда даже после «смерти» объекта сессии останется 12 порожденных потоков.

Можно ли как-то все-таки завершить потоки? Потому что моя архитектура процесса предусматривает все же множественное создание разных сессий, а количество возможных потоков на процесс x32 не так велико, учитывая стек и «обвязку». И когда количество потоков превысит 500-700, дальше процесс перестанет работать.


Добавить комментарий