add concurrent.futures based implementation