use threadpool over naive threading; avoid running out of threads