map — это применение функции к каждому элементу списка
То есть, pool.map(f, links) — это тоже самое, что (f(x) for x in links), только запускается в пуле потоков "параллельно"
Порядковый номер — сделай enumerate.
def f(t):
i, l = t
print(f"{l=} {i=}")
with ThreadPoolExecutor() as pool:
for _ in pool.map(f, enumerate(["link1", "link2"])):
pass