每n秒重复运行两个不同的函数

时间:2017-05-03 19:38:24

标签: python multithreading

我有两个功能:foo()应该每5秒启动一次,bar()应该每10秒启动一次。 代码如下:

import threading
import time


def foo():
    while True:
        time.sleep(5)
        print("Call every 5 seconds")
        time.sleep(5)

def bar():
    while True:
        time.sleep(10)
        print("Call every 10 seconds")


tr1 = threading.Thread(target=foo)
tr1.start()
tr2 = threading.Thread(target=bar)
tr2.start()

但我认为这不是一个好的解决方案。 做这个的最好方式是什么? 是的,我认为我有内存泄漏,我应该使用垃圾收集器还是其他什么?

P.S。我希望你能理解我写的东西,因为我不是母语。

2 个答案:

答案 0 :(得分:0)

在评论中使用depperm发布的链接

import sched, time
s = sched.scheduler(time.time, time.sleep)

def foo(s):
    print("Call every 5 seconds")
    s.enter(5, 1, foo, (s,))

def bar(s):
    print("Call every 10 seconds")
    s.enter(10, 1, bar, (s,))

s.enter(5, 1, foo, (s,))
s.enter(10, 1, bar, (s,))
s.run()

答案 1 :(得分:0)

您的代码稍作修改,加上一些print语句表明这项工作正常。关于这段代码的“好”之处在于sleep如果它的参数为负,则会引发异常。因此,如果预期花费少于五秒或十秒的代码分别花费更长时间,则脚本将会死亡。

import threading
import time
from datetime import timedelta, datetime

def foo(delay=5):
    while True:
        t_start = time.time()
        print("Call every %s seconds" % delay, datetime.now().strftime('%H.%M.%S'))
        t_end = time.time()
        time.sleep(delay-(t_end-t_start))

def bar(delay=10):
    while True:
        t_start = time.time()
        print("Call every %s seconds" % delay, datetime.now().strftime('%H.%M.%S'))
        t_end = time.time()
        time.sleep(delay-(t_end-t_start))

tr1 = threading.Thread(target=foo)
tr1.start()
tr2 = threading.Thread(target=bar)
tr2.start()

这是输出。

>pythonw -u "temp1.py"
Call every 5 seconds 17.09.51
Call every 10 seconds 17.09.51
Call every 5 seconds 17.09.56
Call every 5 seconds 17.10.01
Call every 10 seconds 17.10.01
Call every 5 seconds 17.10.06
Call every 5 seconds 17.10.11
Call every 10 seconds 17.10.11
Call every 5 seconds 17.10.16
Call every 5 seconds 17.10.21
Call every 10 seconds 17.10.21
Call every 5 seconds 17.10.26
Call every 10 seconds 17.10.31
Call every 5 seconds 17.10.31
Call every 5 seconds 17.10.36

>Process failed to respond; forcing abrupt termination...
>Exit code: 1

我不能说这是否是“最好”的做法。至少函数的内容以或多或少的规则时间间隔开始。