not download same url twice
multi-thread, use WaitGroup