Почему теряются миллисекунды, использовав функции ожидания?

Я стараюсь реализовывать программу, которая делала бы просьбы каждая точная минута, я нашел несколько функций в дорожке, но многие из них теряют какие-то миллисекунды и в определенном времени складывая потерянные это будет 1 секунда или более, это будет производить мне проблемы и важные сдвиги фаз, которое я имею в виду, это будет следующее:

tiempo_1.py

import time

contador = 0
while contador < 10:
    print datetime.now()
    contador += 1
    time.sleep(30)

Результаты:

2017-01-26 11:48:48.813558
2017-01-26 11:49:18.833623
2017-01-26 11:49:48.836416
2017-01-26 11:50:18.860363
2017-01-26 11:50:48.868115
2017-01-26 11:51:18.897203
2017-01-26 11:51:48.926559
2017-01-26 11:52:18.953411
2017-01-26 11:52:48.982873
2017-01-26 11:53:18.988292

Начнись в.81 и закончись в.98, в 10 повторениях я потерял 0.17 секунд

tiempo_2.py

from datetime import datetime
import schedule
import time

def tiempo():
    print datetime.now()

schedule.every(30).seconds.do(tiempo)

while 1:
    schedule.run_pending()
    time.sleep(1)

Результаты:

2017-01-26 11:54:23.268964
2017-01-26 11:54:53.302266
2017-01-26 11:55:23.335505
2017-01-26 11:55:53.367644
2017-01-26 11:56:23.397164
2017-01-26 11:56:53.430264
2017-01-26 11:57:23.462877
2017-01-26 11:57:53.494474
2017-01-26 11:58:23.526921
2017-01-26 11:58:53.559479

В этом случае я потерял 0.29 секунд с первой до десятого раза.

Сначала я подумал, что он был из-за того, что использовал prints, удалил их и использовал вставления в списках, он продолжал терять то же время, снимите списки и только я измерил время и он делал debug с logging, терял то же время: Из чего он проистекает? Как я могу предотвращать это? Как я способствую тому, чтобы моя программа работала n разы в 11:58:53.0000?

2
задан 26.01.2017, 20:05
0 ответов

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

У процессора есть ограниченное количество инструкций, которые он может обрабатывать в секунду и только может выполнять инструкцию одновременно (с процессорами нескольких основ это меняется, так как каждая основа выполняет инструкцию во времени X). Так что, хотя он тебе покажется невероятным, включенным, когда ты слушаешь песню на твоем компьютере, есть моменты, в которых CPU не посылает говорящим инструкцию, которой он воспроизводит звук.

Итак, тогда, поскольку он состоит в том, что музыка слушается "Продолженный", и я могу выполнять я запрограммированная и он кажется "Непрерывным" пока работают также все процессы SO. Так как у процессоров есть частота часов, которые вместе с количеством основ и технологией, с которой они были построены, дадут тебе количество инструкций, которое может выполнять в секунде твой процессор (он сдерживается в миллионах)

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

  • У процессов есть состояние.
  • Процессы справляются из-за очереди, но все же у каждого процесса есть первенство, которое может менять эту очередь.

Состояния - следующие:

  1. Элемент списка
  2. Выполнение: Процесс находится в выполнении он обрабатывается
  3. Я заношу в список: Процесс готов, чтобы быть обработанным, расположен входить в резерве в выполнение
  4. В резерве: Процесс не может работать до тех пор, пока не случится некое событие (в этом состоянии ты помещаешь в твой процесс, когда ты делаешь один time.sleep(1))
  5. Новый: Процесс был создан и будь в резерве, SO допущен.
  6. Законченный: Процесс закончился и был исключен из очереди процессов.

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

Так тогда во время делания time.sleep ты помещаешь в твой процесс в способ ожидания из-за одного n время, переместив этот период времени, он не значит, что твой процесс войдет в это мгновение, так как он находится в очереди.

В конце концов помни, что каждая инструкция твоей программы опаздывает время (включая циклы, print...) и кроме того помнит, что функция, которую ты называл бы, как datetime.now () также у него есть инструкции внутри, которые также медлят время с тем, чтобы работать, в котором также проходит время, кроме которого уже ты дан в time.sleep.

Так что ты не обвинил в функции ожидания, вины в также инструкции и функции, которые ты пишешь или которые называешь.

Заметь: любая инструкция, которая они посылают что-то в любое периферийное устройство, как печатать что-то на экране они опаздывают больше времени, чем другие инструкции, которые только должны реализовывать арифметические и логические операции

2
ответ дан 03.12.2019, 17:29

Посмотрим:

  1. Теоретически я не думаю, что ты можешь гарантировать это с какой-либо программой если только ты не используешь Операционную систему Реального времени
  2. Поиски "Python+Real Тайм" не бросили очень обнадеживающие результаты.

Разум, потому что ты не можешь гарантировать, что вещи будут происходить со вторым точным, состоит в том, что, хотя ты не будешь верить в это в операционную систему он для него прекращает импортировать немного твое приложение каждый раз, когда ты звонишь в sleep, или ты ждешь из-за E/S, или переводчика Python проверь, если он может менять контекст и выполнять родной необходимый код, чтобы доставать символы из-за конечной остановки.

Если ты смотришь эту статью о команде, украдите, может быть, я осветлил тебя немного больше

2
ответ дан 03.12.2019, 17:29