#python #multithreading
#python #многопоточность
Вопрос:
Я пытаюсь закончить свой курс программирования и застрял на одном упражнении.
Я должен посчитать, сколько времени требуется в Python для создания потоков и зависит ли это от количества созданных потоков.
Я написал простой скрипт, и я не знаю, хорош ли он:
import threading
import time
def fun1(a,b):
c = a b
print(c)
time.sleep(100)
times = []
for i in range(10000):
start = time.time()
threading.Thread(target=fun1, args=(55,155)).start()
end = time.time()
times.append(end-start)
print(times)
В times[] я получил 10000 результатов, близких к 0.0 или точно 0.0.
И теперь я не знаю, создал ли я тест, потому что я чего-то не понимаю, или, может быть, результат правильный и время создания потока не зависит от количества уже созданных?
Можете ли вы помочь мне с этим? Если это решение worn, объясните мне, почему, или, если оно правильное, подтвердите его? 🙂
Комментарии:
1. Когда вы говорите «зависит ли это от количества уже созданных», вы надеетесь измерить, влияет ли наличие других потоков на время создания или влияют ли другие потоки, работающие в фоновом режиме (т. Е. Запущенные потоки) на время создания? Это было бы совсем по-другому
2. Я думаю, что речь идет о первом. Задача описана так, чтобы я мог интерпретировать ее в любом случае
3. Я получаю разумные цифры, выполняющие это. В любом случае вы можете измерить время в начале и в конце цикла, а затем получить среднее значение по количеству потоков
Ответ №1:
Итак, есть два способа интерпретировать ваш вопрос:
- Влияет ли существование других потоков (которые еще не были запущены) на время создания новых потоков
- Влияют ли другие потоки, работающие в фоновом режиме (уже запущенные потоки), на время создания новых потоков.
Проверка первого
В этом случае вы просто не запускаете потоки:
import threading
import time
def fun1(a,b):
c = a b
print(c)
time.sleep(100)
times = []
for i in range(10):
start = time.time()
threading.Thread(target=fun1, args=(55,155)) # don't start
end = time.time()
times.append(end-start)
print(times)
вывод для 10 запусков:
[4.696846008300781e-05, 2.8848648071289062e-05, 2.6941299438476562e-05, 2.5987625122070312e-05, 2.5987625122070312e-05, 2.5987625122070312e-05, 2.5987625122070312e-05, 2.5987625122070312e-05, 2.5033950805664062e-05, 2.6941299438476562e-05]
Как вы можете видеть, время примерно такое же (как и следовало ожидать).
Проверка второго
В этом случае мы хотим, чтобы ранее созданные потоки продолжали выполняться по мере создания новых потоков. Итак, мы даем каждому потоку задачу, которая никогда не завершается:
import threading
import time
def fun1(a,b):
while True:
pass # never ends
times = []
for i in range(100):
start = time.time()
threading.Thread(target=fun1, args=(55,155)).start()
end = time.time()
times.append(end-start)
print(times)
вывод:
Более 100 запусков, первый из которых занял 0.0003440380096435547
, тогда как последний занял 0.3017098903656006
, так что там довольно значительное увеличение.
Комментарии:
1. Большое спасибо @Aziz 🙂