У меня есть следующий код:Python Многопоточность основы спутанность
import time
from threading import Thread
def fun1():
time.sleep(5)
def fun2():
time.sleep(5)
def fun3():
time.sleep(5)
def fun4():
time.sleep(5)
if __name__ == '__main__':
t1 = Thread(target=fun1, args=())
t2 = Thread(target=fun2, args=())
t3 = Thread(target=fun3, args=())
t4 = Thread(target=fun4, args=())
t1.start()
t2.start()
t3.start()
t4.start()
start = time.clock()
t1.join()
t2.join()
t3.join()
t4.join()
end = time.clock()
print("Time Taken = ",end-start)
Que1: В то время только один поток будет обслуживаемой, то есть, если элемент управления с резьбой t1, остальные другие потоки будут ждать. После переключения контекста в поток t2 останутся остальные потоки (t1, t3 и t4). Это правильное понимание?
Que2: Если мое понимание Que1 истинно, общее время (начало-конец) должно составлять двадцать секунд (как работает как последовательное, а не многопоточное) ... но оно несколько близко к 5 секундам .... почему? В конце дня потоки выполняются последовательно (хотя и не полностью) один за другим. Пожалуйста, объясните в условиях мирян. Где мое понимание неверно?
Que3: Что делать, если я делаю то же самое, используя многопроцессорность? Как будет выполняться выполнение?
Que4: Предположим (предположим) fun1() имеет код, который выполняет 1000 повторов счетчика ping для маршрутизатора 1 и занимает время 1 мин. Similary, fun2() выполняет 1000 повторов счетчика ping на маршрутизатор 2 и занимает время 1 мин. Similary, fun3() выполняет 1000 повторов счетчика ping на маршрутизатор 3 и занимает время 1 мин.
Если я делаю это последовательно, общее ожидаемое время составляет 3 минуты (пинг на R1, затем пинг на R2, а затем пинг на R3) Но когда я сделал это с помощью потоковой передачи, общее время выполнения было почти близко к 1 минимум Зачем ? Я не могу понять.