我想问一下:自从我们启动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()
答案 0 :(得分:4)
import threading
def func():
#your code here
t = threading.Timer(3600, func)
t.start()
感谢@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()
这将在每小时后调用打印功能并打印消息。