自python程序启动以来,如何计算1小时?

时间:2017-05-30 10:30:46

标签: python multithreading

我想问一下:自从我们启动python程序以来,如何编写一个python程序来计算1小时?

我举一个例子: - 我们在17:00:00启动了python程序 - 运行1小时后(18:00:00),python程序将打印一条消息,告知已经过了1小时。

我可以找出一个python程序。首先,我记录启动程序的时间(称为start_time),然后我连续记录下一次(称为end_time)。如果(end_time - start_time == 1小时),则会打印一条消息。

然而,程序似乎浪费了如此多的CPU性能!我需要一个能降低CPU性能的程序。

编辑: 我需要如下。

我有一个帖子名wait_an_event_thread。这是一个阻塞线程。如果未设置事件trigger,则阻止此线程。 在阻塞时间内,如果已经过了1小时,则该线程会打印出一条消息。 这是我的期望。

以前,我说过我下次连续录音(来电end_time)。这意味着我打算从阻塞线程更改为非阻塞线程,因为如果传递1小时我不知道如何在阻塞线程中打印消息。但似乎非阻塞线程占用了如此多的CPU性能。

这是我的代码:
我的期望:阻止线程

def wait_an_event_thread(trigger):
    trigger.wait()
    # If 1 hour has been passed, it print a message
    # How to print message if 1 hour has been passed in this blocking thread if the "trigger" event is not set??

trigger  = threading.Event()
wait_an_event_thread = threading.Thread(name='wait_an_event_thread', 
                       target=wait_an_event_thread,
                       args=(trigger,))
wait_an_event_thread.start()

5 个答案:

答案 0 :(得分:4)

import threading

def func():
    #your code here

t = threading.Timer(3600, func)
t.start()

More details in documentation

感谢@IljaEverilä的更正和改进

答案 1 :(得分:1)

事实证明你需要使用Event.wait() timeout 参数,并检查事件是否已在返回时设置:

def wait_an_event_thread(trigger):
    while not trigger.wait(3600):
        print "1 hour has passed"

    # Do what must be done when triggered

trigger = threading.Event()
the_thread = threading.Thread(name='wait_an_event_thread', 
                              target=wait_an_event_thread,
                              args=(trigger,))
the_thread.start()

如果未设置事件,这将继续在小时(ish)间隔之间打印诊断消息。 Event.wait() might behave badly if your system clock jumps backwards

答案 2 :(得分:0)

您可以利用多线程并创建一个单独的线程,该线程与其余代码分开运行。该线程只是睡了1小时然后打印“1h已经过去”然后再睡一小时。

要将其置于代码格式中,您将需要以下内容:

import time
def print_message_every_interval( threadName, message, interval=3600, ):
   while True:
      time.sleep(interval) #interval in seconds
      print ("%s: %s: %s" % ( threadName, time.ctime(time.time()), message ))

并在你的main()中添加如下内容:

  import _thread

  if __name__=="__main__":
   #
   # your init code here
   #
   try:
    _thread.start_new_thread( print_message_every_interval, \
     ("Timer-1h", "One hour have passed", 3600 ) )
   except Exception as e:
    print('could not start new thread')
    print(e)
   #
   # the rest of your code here
   #

当然,您可以使用许多多线程库来使代码看起来很花哨。与threading模块一样。

您可以在此处找到有关此主题的更多信息: https://www.tutorialspoint.com/python3/python_multithreading.htm

答案 3 :(得分:0)

我建议你在一小时后使用

`time.sleep(t)` 

t尽可能高,而不影响您的计划。

答案 4 :(得分:0)

启动一个线程,它会在每小时后调用一个函数并打印消息。 你可以用你的main函数编写这样的代码: 导入线程

def print():
    print "One Hour has been passed"

t = threading.Timer(3600, print)
t.start()

这将在每小时后调用打印功能并打印消息。