Сколько времени требуется для создания потока в python

#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:

Итак, есть два способа интерпретировать ваш вопрос:

  1. Влияет ли существование других потоков (которые еще не были запущены) на время создания новых потоков
  2. Влияют ли другие потоки, работающие в фоновом режиме (уже запущенные потоки), на время создания новых потоков.

Проверка первого

В этом случае вы просто не запускаете потоки:

 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 🙂