Python как использовать многопоточность в мультизагрузке - PullRequest
2 голосов
/ 26 марта 2020

Я использую threading для параллельной загрузки, теперь у меня есть url_list img_list Я хочу скачать его в 2-х ветках, поэтому def две загрузки.

Я положил половину в download1 и половину в download2 так что это ускорится до завершения, но, наконец, когда я запускаю скрипты, моя загрузка все еще в серийном режиме, я не знаю почему, как я могу изменить свой скрипт?

вот код:

import requests,threading
img_list=[...]
num=len(img_list)
def download_1(img_list):
    n=0
    for i in img_list:
        n+=1
        with open('./img/'+str(n)+'.jpg','wb')as f:
            f.write(requests.get(i).content)
            print(str(n)+"download1 complete")
def download_2(img_list):
    n=len(img_list)
    for i in img_list:
        n+=1
        with open('./img/'+str(n)+'.jpg','wb')as f:
            f.write(requests.get(i).content)
            print(str(n)+"download2 complete")
thread_1 = threading.Thread(target=download_1(img_list[:int(num/2)]))
thread_2 = threading.Thread(target=download_2(img_list[int(num/2):]))
thread_1.start()
thread_2.start()

Ответы [ 2 ]

1 голос
/ 26 марта 2020

В этой строке

threading.Thread(target=download_1(img_list[:int(num/2)]))

вы вызываете download_1(...) и передаете результат (ноль) в поток. Вот почему он работает поочередно. Вместо этого вы хотите передать download_1 саму функцию (а не результат ее вызова) в поток. Вот так:

threading.Thread(target=download_1, args=(img_list[:int(num/2)],))

Сделайте это в обоих местах.

Примечание: вы должны t.join() обе нити в конце.

0 голосов
/ 26 марта 2020

Вы вызываете обе функции во время создания потоков. Итак, потоки пропускаются нулем и, следовательно, ничего не делают. Вы должны изменить код следующим образом:

thread_1 = threading.Thread(target=download_1, args=(img_list[:int(num/2)]))
thread_2 = threading.Thread(target=download_2, args=(img_list[int(num/2):]))

thread_1.start()
thread_2.start()
...