Будет ли другой поток выполняться, пока другой поток ожидает ответа HTTP? - PullRequest
2 голосов
/ 28 мая 2020

Итак, я только что закончил смотреть это видео на YouTube. Насколько я понимаю, пока один поток спит, другие потоки в программе могут работать. У меня вопрос, считается ли ожидание ответа HTTP "спящим"? И будут ли выполняться другие задачи в ожидании ответа?

Например:

from threading import Thread
from requests import get

def send_request():
    response = get('https://www.google.com/')
    return response

def add(x):
    return x + 2

t1 = Thread(target=send_request)
# t1.start()
t2 = Thread(target=add, args=(1,))
# t2.start()
t3 = Thread(target=add, args=(3,))
# t3.start()

t1.start()
t2.start()
t3.start()

Допустим, для получения ответа от get('https://www.google.com/') требуется 100 миллисекунд, будут t1 и t2 выполнить в течение 100 миллисекунд, чтобы получить ответ? Какая разница, когда я вызываю .start() для каждого объекта потока после создания экземпляра ВСЕ в отличие от вызова .start() после КАЖДОГО экземпляра?

Спасибо всем, кто ответит заранее!

1 Ответ

1 голос
/ 28 мая 2020

Считается ли ожидание ответа HTTP «спящим»?

Ожидание ответа HTTP происходит медленно, и ЦП, скорее всего, переключится на выполнение других потоков до того, как ответ станет доступен. Итак, ответ: да .

Будут ли другие задачи выполняться в ожидании ответа?

Да . Если вы поместите оператор print внутри функций add и send_request, вы увидите, что add распечатает свой вывод до send_request.

Какая разница, когда я вызов .start() для каждого объекта потока после создания экземпляра ВСЕХ, а не вызов .start() после КАЖДОГО экземпляра?

Практически нет разницы . Когда поток запускается (с использованием start()), он запускается одновременно с потоком основной программы. Основной поток также может запускать другие потоки, и они также будут выполняться одновременно.

...