При работе с многопоточностью все виды других факторов могут влиять на то, что вы видите. Поскольку вы буквально добавляете подпроцессы в диспетчер процессов вашей ОС, они будут работать совершенно отдельно от вашей запущенной программы, включая наличие собственных ресурсов, приоритетов планирования, каналов и т. Д. c.
1.) Нет Причина в том, что каждый дочерний процесс получает свой собственный выходной буфер, в который он записывает, который записывается обратно в родительский процесс. Поскольку вы запускаете оба дочерних процесса, а затем указываете родительскому процессу блокировать поток до завершения подпроцесса p1, дочерний процесс p2 не может записать свой буфер в родительский процесс до завершения процесса p1. Вот почему, несмотря на ожидание 12 секунд, результат процесса p2 по-прежнему составляет 0,7 секунды.
2.) Трудно точно знать, почему подпроцессу потребовалось 12 секунд, чтобы запустить его. Это может быть что-то в вашем коде или это может быть дюжина других причин, таких как совершенно другой процесс, который на время угоняет ваш процессор. Во-первых, time.clock, вероятно, не то, что вы ищете, если вы пытаетесь измерить фактическое время по сравнению с тем, сколько времени процесс потратил на процессор. Другие комментаторы правильно рекомендовали использовать высокопроизводительный счетчик для точного отслеживания времени, чтобы убедиться, что в измерении времени нет никаких странностей. Кроме того, при запуске, запуске и завершении нового процесса всегда есть некоторый уровень издержек, хотя, конечно, он не стоит 12 секунд. Лучший способ определить, являются ли эти 12 секунд чем-то, что вы могли бы контролировать или нет, - это запустить приложение несколько раз и посмотреть, есть ли большая разница между суммарным результатом. Если есть, это могут быть другие условия, связанные с компьютером, на котором он запущен.
3.) Я предполагаю, что проблема заключается в измерении time.clock. Вызов time.clock вычисляет, сколько времени процесс потратил на процессор. Поскольку вы используете несколько процессов, time.clock сбрасывается в 0 при запуске процесса. Это относительное время, а не абсолютное время, и относительно продолжительности процесса. Если вы перемещаетесь между процессами или спящими потоками, time.clock не обязательно будет увеличивать то, что вы думаете, измеряя абсолютное время. Вы должны использовать что-то вроде time.time () или, еще лучше, высокопроизводительный счетчик для правильного отслеживания реального времени.