2016-07-26 4 views
0

С помощью модуля подпроцесса, я бег 1000 звонков спать (1) параллельно:Параллельные вызовы сна не складываются

import subprocess 
import time 
start = time.clock() 

procs = [] 
for _ in range(1000): 
    proc = subprocess.Popen(["sleep.exe", "1"]) 
    procs.append(proc) 

for proc in procs: 
    proc.communicate() 

end = time.clock() 
print("Executed in %.2f seconds" % (end - start)) 

На моих 4-ядерных машинах, это приводит к исполнению время в пару секунд, намного меньше, чем я ожидал (~ 1000 с/4).

Как его оптимизировать? Это зависит от реализации сна (это взято из Windows-Git-исполняемых файлов)?

+2

Ну, конечно, время выполнения событий, происходящих параллельно, не складывается. Если я сплю 8 часов в то же время, вы спите в течение 8 часов, пройдите 16 часов? – user2357112

+2

Почему вы ожидали 500 секунд? –

+0

как вы придумали цифру 500? – njzk2

ответ

1

Это потому, что subprocess.Popen(..) является не блокирующим вызовом. Поток просто запускает создание дочернего процесса и переходит к нему. Он не ждет, пока он закончит.

Другими словами, вы создаете 1000 асинхронных процессов в цикле и затем ожидаете их поочередно. Это асинхронное поведение приводит к общему времени работы в несколько секунд.


Вызов proc.communicate() ждет, пока дочерний процесс не будет завершен (завершился). Теперь, если вы хотите, раз спать, чтобы сложить (минус создание процесса/уничтожение) над головой, вы могли бы сделать:

import subprocess 
import time 
start = time.clock() 

procs = [] 

#Get the start time 
for _ in range(10): 
    proc = subprocess.Popen(["sleep.exe", "1"]) 
    procs.append(proc) 
    proc.communicate() 

#Get the end time 

ли это зависит от реализации сна (это один берется из Windows-Git-исполняемых файлов)?

Как я изложил выше, это не имеет никакого отношения к осуществлению сна.

2

Спящий режим не требует процессорного времени, поэтому ваша операционная система может запускать гораздо больше, чем 4 запроса на просмотр за раз, хотя у него всего 4 ядра. В идеальном случае он сможет обрабатывать всю партию 1000 за 1 секунду, но при создании и отрыве отдельных процессов есть много накладных расходов.

Смежные вопросы