【问题标题】:Does time.sleep() stop all executions?time.sleep() 是否停止所有执行?
【发布时间】:2015-12-10 21:30:36
【问题描述】:

在我复杂的 python 程序中,当它运行时,我有一段每 3 秒执行一次的代码,它将程序的进度打印为执行完成的百分比,如下所示:

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

time.sleep() 函数会减慢我的程序吗?我读了那个睡眠功能暂停执行。如果它减慢了我的程序,是否有更正确的方法可以每 3 秒向我打印一次进度?

【问题讨论】:

  • 它会睡觉,就像你睡着了一样。
  • 我认为实际上还有另一个线程在做这项工作?
  • @njzk 是的,我有大约 10 个线程在做自己的工作。
  • 是的,它会阻塞在那里直到时间到期。要在保持程序运行的同时使用计时器进行输出,请使用带有threading.Timer 的线程。

标签: python time sleep


【解决方案1】:

是的,time.sleep 将停止您的程序。

在循环中使用time.time 并检查三秒后的时间。

【讨论】:

    【解决方案2】:

    time.sleep(seconds) 将停止在 current 线程上的执行。因此,它将完全停止您在该线程上的程序:在这些秒过去之前不会发生任何其他事情。

    您不必担心这一点。如果程序使用线程,那么其他线程不应该停止。

    【讨论】:

    • 这对我来说是部分情况。结果我的 10 个其他线程没有中断,但是当最后需要收集我的所有数据并将其放入主线程中的一个最终 CSV 时,这就是减慢速度的地方。感谢您提供有用的信息! :D
    • @Rafi 你是如何线程化应用程序的?您使用的是multiprocess.Pool 吗?我有点困惑为什么你会在主线程上停止执行,并且可能有一种方法可以提高效率
    • 不,我没有使用它,我只是使用threading.Thread() 创建新线程。我正在使用这些线程来抓取 csv 的 url,以使用机械化和正则表达式从它们中抓取电子邮件。
    • @Rafi 这听起来很有趣 :) 进入multiprocessing 可能是一本不错的读物。它提供了许多创建线程和标准化操作的有用方法。这是一个标准的 Python 库,正在取代 threading。以下是相关文档:docs.python.org/2/library/multiprocessing.html
    • 太棒了,非常感谢,我一定要让这个电子邮件爬虫运行得更快。到目前为止,它是每分钟 500 封电子邮件。如果电子邮件网站目录检测到来自某个位置的高流量,它们往往会故意增加网页的加载时间。
    【解决方案3】:
    from time import time
    
    prev = time()
    while True:
        now = time()
        if now - prev > 3:
            print 'report'
            prev = now
        else:
            pass
            # runs
    

    【讨论】:

    • 完美运行,非常简单!谢谢。 :D
    • 这太可怕了。你基本上一直没有操作,而sleep 只会告诉调度程序停止在这个线程上浪费时间 3 秒。
    • 你基本上只是在复制time.sleep(),没有任何理由。这样做的目的是什么?它甚至没有回答问题它会停止所有执行...
    • 为避免漂移,请使用截止日期:if timer() > deadline: deadline += 3
    【解决方案4】:

    正确的做法是使用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
    

    【讨论】:

    • 请注意,将信号处理程序用于任何繁重的任务可能是灾难性的。首先,alarm(2) 不能保证是可重入的,并且在信号处理程序中是不安全的。其次,Pythonraise 可能对信号处理程序做了很多不安全的操作。此外,对于 Python 来说,如果你的程序在慢速系统调用过程中收到信号,例如 read(2)write(2)the syscall appears to block signals until completion,则会导致警报丢失。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多