Рабочие потоки в пуле не создаются при вызове pool.apply_async
или других методах пула, но уже раньше, когда вы создаете экземпляр пула.При вызовах методов пула используются существующие потоки в пуле.
Невозможно назвать потоки при инициализации без манипулирования источником.Возможны следующие варианты:
- переименование рабочих потоков после пул готов к созданию экземпляра
- внутреннее исправление пула обезьяны для принудительного применения определенного шаблона именования
Первый вариант прост в реализации, вы просто перебираете атрибут ._pool
экземпляра пула и изменяете .name
содержащихся в нем потоков:
from multiprocessing.pool import ThreadPool as Pool
if __name__ == '__main__':
pool = Pool(4)
print([w.name for w in pool._pool])
# ['Thread-1', 'Thread-2', 'Thread-3', 'Thread-4']
for w in pool._pool:
w.name = w.name.replace('Thread', 'ThreadPoolWorker')
print([w.name for w in pool._pool])
# ['ThreadPoolWorker-1', 'ThreadPoolWorker-2', 'ThreadPoolWorker-3', 'ThreadPoolWorker-4']
pool.close()
pool.join()
Обратите внимание, что я использую multiprocessing.pool.ThreadPool
здесь, просто чтобы соответствовать примеру во втором варианте ниже, так как multiprocessing.dummy.Pool
является просто оберткой вокруг ThreadPool
.
Для второго варианта этоможно было бы пропатчить фабричную функцию для рабочих потоков ThreadPool.Process
с помощью обертки, расширив имя по умолчанию «Thread-% d» (% d заполнено значением счетчика) с более значимым именем, например «ThreadPoolWorker».'.
# threadpool.py
# Module patching the name of worker-threads within ThreadPool
__all__ = ['ThreadPool']
from functools import wraps
from multiprocessing.pool import ThreadPool
def rename_worker(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
w = fn(*args, **kwargs)
w.name = w.name.replace('Thread', 'ThreadPoolWorker')
return w
return wrapper
ThreadPool.Process = staticmethod(rename_worker(ThreadPool.Process))
Использование:
from threadpool import ThreadPool as Pool
if __name__ == '__main__':
pool = Pool(4)
print([w.name for w in pool._pool])
# ['ThreadPoolWorker-1', 'ThreadPoolWorker-2', 'ThreadPoolWorker-3', 'ThreadPoolWorker-4']
pool.close()
pool.join()