2016-08-26 4 views
4

У меня есть следующий код:Python Многопоточность против многопроцессорных против последовательного исполнения

import time 
from threading import Thread 
from multiprocessing import Process 

def fun1(): 

for _ in xrange(10000000): 
     print 'in fun1' 
     pass 

def fun2(): 

for _ in xrange(10000000): 
     print 'in fun2' 
     pass 

def fun3(): 

for _ in xrange(10000000): 
     print 'in fun3' 
     pass 

def fun4(): 

for _ in xrange(10000000): 
     print 'in fun4' 
     pass 

if __name__ == '__main__': 

    #t1 = Thread(target=fun1, args=()) 
    t1 = Process(target=fun1, args=()) 
    #t2 = Thread(target=fun2, args=()) 
    t2 = Process(target=fun2, args=()) 
    #t3 = Thread(target=fun3, args=()) 
    t3 = Process(target=fun3, args=()) 
    #t4 = Thread(target=fun4, args=()) 
    t4 = Process(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) 

    ''' 
    start = time.clock() 
    fun1() 
    fun2() 
    fun3() 
    fun4() 
    end = time.clock() 
    print("Time Taken = ",end-start) 
    ''' 

Я побежал выше программы тремя способами:

  • Первое последовательное выполнение ALONE (смотреть на комментариями, и комментарий верхний код)
  • Второе многопотоковое выполнение ОДНО
  • Третье выполнение многопроцессорности ОДНО

наблюдений за время end_time пуска следующим образом:

Общее время Выполняемые

  • ('Время Взятым =', 342,5981313667716) --- Хронометража по резьбового исполнению
  • ('Time Taken =', 232.94691744899296) --- Продолжительность спектакля последовательный Выполнение
  • ('Время Взятые =', +307,91093406618216) --- Продолжительность казнью Multiprocessing

Вопрос:

Я вижу последовательное выполнение занимает минимум времени и многопоточность занимает наибольшее время , Зачем? Я не могу понять, а также удивлен результатами. Пожалуйста, уточните.

Поскольку это задача с интенсивным процессором и получен GIL, мое понимание было . Многопроцессорство заняло бы наименьшее время, в то время как выполнение с потоком занимает наивысшее время. Пожалуйста, подтвердите мое понимание.

ответ

5

Вы используете time.clock, который дал вам время CPU, а не в реальном времени: вы не можете использовать это в своем случае, так как оно дает вам время выполнения (как долго вы использовали CPU для запуска вашего кода, который будет почти в то же время для каждого из этого случая)

Запуск кода с time.time() вместо time.clock дал мне это время на моем компьютере:

Process : ('Time Taken = ', 5.226783990859985) 
seq : ('Time Taken = ', 6.3122560000000005) 
Thread : ('Time Taken = ', 17.10062599182129) 

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

Для Threading, поскольку у вас может быть только один поток, запущенный из-за GIL, вы последовательно выполняете все свои функции, но у вас были накладные расходы на потоки (изменение потоков каждые несколько итераций может стоить до нескольких миллисекунд каждый раз) , Таким образом, вы получаете что-то гораздо медленнее.

Threading полезно, если у вас есть время ожидания, поэтому вы можете запускать задачи между ними.

Multiprocessing полезен для вычисления дорогостоящих задач, если возможно, полностью независимых (без общих переменных). Если вам нужно обмениваться переменными, вам придется столкнуться с GIL, и это немного сложнее (но не исключено большую часть времени).

EDIT: На самом деле, используя time.clock, как будто вы дали информацию о том, сколько накладных расходов использовало Threading и Multiprocessing.

0

В принципе, вы правы. Какую платформу вы используете для запуска фрагмента кода? Я думаю, Windows. Обратите внимание, что «печать» не связана с ЦП, поэтому вы должны прокомментировать «печать» и попытаться запустить ее в Linux, чтобы увидеть разницу (это должно быть то, что вы ожидаете). Используйте код:

def fun1(): 

for _ in xrange(10000000): 
     # No print, and please run on linux 
     pass 
Смежные вопросы