В первом фрагменте вы фактически ждете завершения каждого потока сначала , , прежде чем начинать другой поток. Вы в основном запускаете его последовательно вместо параллельного.
for url in urls:
thread1 = Thread(target=get_content, args=(url,))
thread1.start()
thread1.join()
То, что вы, вероятно, захотите сделать при работе с потоками, - это сохранить каждый поток в контейнере (списке), запустить все потоки и дождаться завершения всех из них.
ths = []
for url in urls:
thread1 = Thread(target=get_content, args=(url,))
thread1.start()
ths.append(thread1)
for t in ths:
t.join()
Этот код фактически делает то, что делает второй фрагмент , просто с помощью цикла.