Вы можете передать initializer
и initargs
на ProcessPoolExecutor
так же, как на multiprocessing.Pool
.Вот пример:
import concurrent.futures
import multiprocessing as mp
def get_user_object(batch):
with _COUNTER.get_lock():
_COUNTER.value += 1
print(_COUNTER.value, end=' ')
def init_globals(counter):
global _COUNTER
_COUNTER = counter
def main():
counter = mp.Value('i', 0)
with concurrent.futures.ProcessPoolExecutor(
initializer=init_globals, initargs=(counter,)
) as executor:
for _ in executor.map(get_user_object, range(10)):
pass
print()
if __name__ == "__main__":
import sys
sys.exit(main())
Использование:
$ python3 glob_counter.py
1 2 4 3 5 6 7 8 10 9
Где:
for _ in executor.map(get_user_object, range(10)):
позволяет перебирать каждый результат ,В этом случае get_user_object()
возвращает None
, поэтому вам не нужно ничего обрабатывать;вы просто pass
и не предпринимаете никаких дальнейших действий. - Последний вызов
print()
дает вам дополнительный символ новой строки, поскольку исходный вызов print()
не использует символ новой строки (end=' '
')