2015-09-14 3 views
0

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

while len(dequeueingFinishedList)!=10: 
    print(str(len(masterListCSV_RowsListFinished)/float(len(masterListCSV_RowsList))*100) + "% done.") 
    time.sleep(3) 

Является ли time.sleep() функции собирается замедлить мою программу? Я прочитал, что функция сна приостанавливает выполнение. Если это замедляет мою программу, есть ли более правильный способ печати прогресса мне каждые 3 секунды?

+1

он будет спать, как если бы вы спали. – taesu

+0

Я предполагаю, что есть еще одна тема, фактически выполняющая работу? – njzk2

+0

@njzk Да, у меня около 10 потоков, выполняющих собственные задания. – Rafi

ответ

0
from time import time 

prev = time() 
while True: 
    now = time() 
    if now - prev > 3: 
     print 'report' 
     prev = now 
    else: 
     pass 
     # runs 
+0

Работал отлично, и все так просто! Благодарю. : D – Rafi

+2

это ужасно. Вы в основном не работаете, в то время как 'sleep' woul просто сообщает планировщику прекратить тратить время на эту нить на 3 секунды. – njzk2

+1

Вы в основном просто копируете 'time.sleep()' без причины, что так всегда. Какова цель этого? Он даже не отвечает на вопрос * останавливает ли все выполнение * ... – Zizouz212

3

Да, time.sleep остановит вашу программу.

Используйте time.time в вашей петле и проверьте, прошло ли три секунды.

0

Правильный способ сделать это с помощью signal

import signal 

def handler(signum, frame): 
    print i 
    if i>100000000: 
     raise Exception("the end") 
    else: 
     signal.alarm(3)  

signal.signal(signal.SIGALRM, handler) 
signal.alarm(3)  

i=0 
while True: 
    i+=1 
+2

Остерегайтесь использования обработчика сигнала для любой тяжелой задачи может быть катастрофическим. Во-первых, 'alarm (2)' не гарантированно является повторным и небезопасным в обработчике сигналов. Во-вторых, Python 'raise', вероятно, делает много небезопасных действий для обработчика сигналов. Кроме того, в случае Python, если ваша программа получает сигнал во время медленного системного вызова, такого как 'read (2)' и 'write (2)', [syscall, как представляется, блокирует сигналы до завершения] (https: // utcc .utoronto.ca/~ cks/space/blog/python/SiginterruptGotcha), что приведет к пропущению тревоги. –

2

time.sleep(seconds) остановит выполнение на текущего нити. Поэтому он полностью остановит вашу программу в этом потоке: ничего не произойдет до тех пор, пока эти секунды не пройдут.

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

+0

Это было частично для меня. Мои 10 других потоков оказались бесперебойными, но когда пришло время собрать все мои данные и поместить их в один финальный CSV в основной поток, вот где это замедлилось. Спасибо за полезную информацию! : D – Rafi

+0

@Rafi Как вы нанизаете приложение? Вы используете «multiprocess.Pool»? Я немного смущен, почему вы бы хотели остановить выполнение в основном потоке, и, вероятно, есть способ, которым вы можете быть более эффективным. – Zizouz212

+0

Нет, я не использую это, я просто создаю новые потоки, используя ' threading.Thread() '. Я использую эти потоки для сканирования csv URL-адресов, чтобы очистить электронные письма от них с помощью механизации и регулярного выражения. – Rafi

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