chenghuang Ответов: 2

Python3 сравните скорость между несколькими потоками и одной проблемой потока


Я столкнулся с проблемой с несколькими потоками в Python3. Я хочу сравнить скорость между одним и несколькими потоками. Но временные затраты на один поток, как мне кажется, неверны в приведенном ниже коде. Это должно быть не менее 2 секунд (из-за GIL скорость между одним и несколькими потоками должна быть почти одинаковой в приведенном ниже коде), но на самом деле это было почти 0 секунд. Я обнаружил, что программа не входит в функцию thread_job() при выполнении функции main (), почему это происходит?

import threading
import time

def thread_job():
    for _ in range(5):
        time.sleep(2)

def main():
    for _ in range(5): #Activate 5 threads to execute the time wait job.        
        added_thread = threading.Thread(target = thread_job)
        added_thread.start()


if __name__ == '__main__':
    start = time.time()
    main()
    end = time.time()
    print("Mutiple thread takes " + str(end - start) + '\n') #calculate the time cost for multiple thread. it should be nearly 2 seconds in theory.

    start_1 = time.time()
    thread_job()
    end_1 = time.time()
    print("single thread takes " + str(end_1 - start_1) + '\n') #calculate the time cost for single thread. it should be nearly 10 seconds in theory.


What I have tried:

<pre>
Output:

Mutiple thread takes 0.0005013942718505859

single thread takes 10.002868175506592


Код был выполнен на windows Visual studio code .

2 Ответов

Рейтинг:
12

Richard MacCutchan

Вы измеряете время окончания многопоточного теста, когда все потоки уже запущены, а не когда они закончились. Вам нужно добавить какое - то действие ожидания в main, чтобы проверить, когда все потоки будут завершены.


Рейтинг:
1

chenghuang

import threading
import time

def thread_job():
    for _ in range(5):
        time.sleep(2)

def main():
    for _ in range(5): #Activate 5 threads to execute the time wait job.        
        added_thread = threading.Thread(target = thread_job)
        added_thread.start()
        threads.append(added_thread)    

if __name__ == '__main__':
    threads = []
    start = time.time()
    main()
    end = time.time()
    for thread in threads:
        thread.join()      #should add join there wait all threads finished.
    print("Mutiple thread takes " + str(end - start) + '\n') #calculate the time cost for multiple thread. it should be nearly 2 seconds in theory.
    start_1 = time.time()
    thread_job()
    end_1 = time.time()
    print("single thread takes " + str(end_1 - start_1) + '\n') #calculate the time cost for single thread. it should be nearly 10 seconds in theory.