天道酬勤,学无止境

Call function every x seconds (Python) [duplicate]

问题

我想每 10 秒调用一次函数(实际上是一个 Web API)。 但是该函数可能需要随机 t 秒才能返回。 (假设 t 为 0.1 到 1.0 秒)

我们能想到的最简单的代码是

while True:
    func()          # take t sec
    time.sleep(10)  # sleep 10 sec

但在这种情况下, func每 (1+t) 秒调用一次。 有更好的方法吗?

我们应该使用一些多线程或类似的东西吗? 具体的代码示例将不胜感激。 谢谢你。

回答1
import time
nexttime = time.time()
while True:
    func()          # take t sec
    nexttime += 10
    sleeptime = nexttime - time.time()
    if sleeptime > 0:
        time.sleep(sleeptime)
回答2

我发现了另一种使用sched模块的方法。

import time
import sched

def daemon(local_handler, t):
    print('time {}'.format(t))
    # call func here
    # time.sleep(2)
    local_handler.enterabs(t + 10, 1, daemon, (local_handler, t+10))

handler = sched.scheduler(time.time, time.sleep)
t = time.time()
handler.enter(0, 1, daemon, (handler, t))
handler.run()

这种方法的一个优点是我们可以精确地控制函数的时间。 例如我们可以在时钟为 0.31, 10.31, 20.31, 30.31, ... 时调用该函数

这段代码取自 Python Scheduler vs loop + sleep。

回答3

试试这个:

from multiprocessing import Pool
import time

pool = Pool(processes=1)              # Start a worker processes.
while true:
    result = pool.apply_async(func, [10], callback=finish) # Evaluate "func(10)" asynchronously calling callback when finished.
    time.sleep(10)

这将每 10 秒调用一次您的函数。 只要您确定返回时间不会超过 10 秒,您应该可以只使用一个工作进程。 来源:Python 中的异步方法调用?

回答4

你可以使用这样的东西:

import time
start=time.perf_counter()
call_new_func()
while ((time.perf_counter()-start)<desired_time_wait):
    pass #busy-wait

在你的while True循环内。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Call function every x seconds (Python) [duplicate]
    This question already has answers here: What is the best way to repeatedly execute a function every x seconds? [closed] (21 answers) Closed 4 months ago. I want to call a function (actually, it is a web API) every 10 seconds. But the function may take random t second to return. (Assume t is 0.1 to 1.0 sec) The simplest code we can think of is while True: func() # take t sec time.sleep(10) # sleep 10 sec but in this case, func is called every (1+t) seconds. Are there better ways to do it? Should we use some multi threading or something like that? Concrete code example will be appreciated. Thank
  • 在Python中执行定期操作(Executing periodic actions in Python [duplicate])
    问题 这个问题已经在这里有了答案: 每x秒重复执行一个函数的最佳方法是什么? (19个回答) 5年前关闭。 我在Windows上工作。 我想每10秒执行一次函数foo() 。 我该怎么做呢? 回答1 在foo()的末尾,创建一个Timer ,该Timer在10秒后会自己调用foo() 。 因为, Timer创建了一个新thread来调用foo() 。 您可以做其他事情而不会受到阻碍。 import time, threading def foo(): print(time.ctime()) threading.Timer(10, foo).start() foo() #output: #Thu Dec 22 14:46:08 2011 #Thu Dec 22 14:46:18 2011 #Thu Dec 22 14:46:28 2011 #Thu Dec 22 14:46:38 2011 回答2 仅仅睡眠10秒钟或使用threading.Timer(10,foo)都会导致开始时间漂移。 (您可能对此并不在意,或者根据您的实际情况,它可能是导致问题的重要根源。)这可能有两个原因-线程唤醒时间或函数执行时间不正确。 您可以在本文的结尾看到一些结果,但首先是如何解决它的示例。 您需要跟踪下一次应何时调用函数,而不是实际调用该函数的时间,并说明差异。 这是一个稍微漂移的版本: import
  • 每n秒运行某些代码[重复](Run certain code every n seconds [duplicate])
    问题 这个问题已经在这里有了答案: 每x秒重复执行一个函数的最佳方法是什么? (19个回答) 5年前关闭。 有没有办法打印例如“ Hello World! 每n秒? 例如,程序将遍历我拥有的所有代码,然后经过5秒钟(使用time.sleep() ),它将执行该代码。 我将使用它来更新文件,但不打印Hello World。 例如: startrepeat("print('Hello World')", .01) # Repeats print('Hello World') ever .01 seconds for i in range(5): print(i) >> Hello World! >> 0 >> 1 >> 2 >> Hello World! >> 3 >> Hello World! >> 4 回答1 import threading def printit(): threading.Timer(5.0, printit).start() print "Hello, World!" printit() # continue with the rest of your code https://docs.python.org/3/library/threading.html#timer-objects 回答2 我对这个问题不屑一顾,是对Alex Martelli的回答的概括
  • 列表理解中的函数-是否多次评估[重复](function inside list comprehension - is it evaluated multiple times [duplicate])
    问题
  • 每N秒定期在线程中实时执行函数(Periodically execute function in thread in real time, every N seconds [duplicate])
    问题 这个问题已经在这里有了答案: 每n秒运行某些代码[重复] (7个答案) 6年前关闭。 我有一个线程化的类,其循环需要每秒执行4次。 我知道我可以做类似的事情 do_stuff() time.sleep(0.25) 但是问题是这并没有考虑到do_stuff()花费的时间。 实际上,这需要是一个实时线程。 有没有办法做到这一点? 理想情况下,当不执行代码时,线程仍将处于休眠状态。 回答1 简单的解决方案 import threading def work (): threading.Timer(0.25, work).start () print "stackoverflow" work () 上面的代码可以确保work以每秒四次的间隔运行,其背后的理论是,它将“排队”对自身的调用,该调用将在未来0.25秒内运行,而无需等待发生。 因此,它几乎可以不间断地完成工作,并且我们非常接近每秒精确执行4次该功能。 通过以下指向python文档的链接可以了解有关threading.Timer更多信息: docs.python.org-16.2.7。 计时器对象 推荐]更高级/动态的解决方案 即使先前的函数按预期工作,您仍可以创建一个辅助函数来帮助处理将来的定时事件。 下面的内容对于该示例来说足够了,希望代码能说明一切-它并不像看起来的那样先进。
  • 每天在同一时间做某事的Python脚本[重复](Python script to do something at the same time every day [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Python中获得类似于Cron的调度程序? [已关闭] (9个答案) 4年前关闭。 我有一个运行很长时间的python脚本,我想每天早上01:00做一些事情。 我一直在查看sched模块和Timer对象,但看不到如何使用它们来实现此目的。 回答1 您可以这样做: from datetime import datetime from threading import Timer x=datetime.today() y=x.replace(day=x.day+1, hour=1, minute=0, second=0, microsecond=0) delta_t=y-x secs=delta_t.seconds+1 def hello_world(): print "hello world" #... t = Timer(secs, hello_world) t.start() 这将在第二天凌晨1点执行一个函数(例如hello_world)。 编辑: 正如@PaulMag所建议的,更一般而言,为了检测是否必须由于该月末到达而必须重置该月的某天,在此上下文中y的定义应如下: y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days
  • Python递归阶乘函数[重复](Python recursive Factorial Function [duplicate])
    问题 这个问题在这里已经有了答案: 理解 Python 中的递归4 个回答 1 年前关闭。 找到了这个解决方案来在 python 中创建一个factorial()函数,但我在理解“为什么”时遇到了麻烦。 功能是: def factorial(x): if x <= 1: return 1 else: return x * factorial(x-1) 我无法理解实际乘法发生在哪里? 在我看来,该函数会不断调用自己,直到达到 1,然后返回 1。有人可以启发我吗? 我确定我错过了一些简单的东西。 回答1 编程的一般提示是插入print语句以帮助您查看代码运行时发生的情况。 当您尝试修复损坏的代码但也有助于理解新代码时,这尤其有用。 在这种情况下,请尝试运行以下命令: def factorial(x): print "x", x if x <= 1: print "base case, returning 1" return 1 else: sub_fact = factorial(x-1) print "factorial(x-1)", sub_fact result = x * sub_fact print "return", result return result factorial(4) 回答2 考虑几个简单的例子: 调用factorial(1) 这将立即返回1
  • 在jQuery中每5秒调用一次函数的最简单方法是什么? [复制](What's the easiest way to call a function every 5 seconds in jQuery? [duplicate])
    问题 这个问题已经在这里有了答案: 每60秒调用一个函数(13个答案) 3年前关闭。 jQuery,如何每5秒调用一次函数。 我正在寻找一种自动化幻灯片显示中的图像更改的方法。 如果可能的话,我宁愿不安装其他任何第三方插件。 回答1 您不需要为此使用纯JavaScript的jquery,以下方法将起作用! var intervalId = window.setInterval(function(){ /// call your function here }, 5000); 要停止循环,您可以使用 clearInterval(intervalId) 回答2 您可以使用setInterval在页面上注册一个间隔,即: setInterval(function(){ //code goes here that will be run every 5 seconds. }, 5000); 回答3 订阅setInterval()并使用clearInterval()停止永远循环的一个好例子: function myTimer() { console.log(' each 1 second...'); } var myVar = setInterval(myTimer, 1000); 调用此行以停止循环: clearInterval(myVar); 回答4 只是第一个答案的小提示。
  • 如何立即启动setInterval循环? [复制](How to start setInterval loop immediately? [duplicate])
    问题 这个问题已经在这里有了答案: 第一次立即执行 setInterval 函数(14 个回答) 7年前关闭。 在一个简单的setInterval setInterval(function() { // Do something every 9 seconds }, 9000); 第一个动作将在9秒后( t=9s )发生。 如何强制循环立即执行第一个动作( t=0 )? 我认为这是由于setInterval的机制具有Delay - Action - Delay - Action ...循环; 而不是Action - Delay - Action - Delay ...循环。 编辑:我的功能确实是一个循环 setInterval(function(){ $('.test').each(function(idx){ var duration = 1000; $(this).delay(duration*idx); Some stuff here }); }, 4000); 回答1 把事情简单化。 您可以使用命名函数代替匿名函数。 调用它并为其设置一个间隔。 function doSomething() { console.log("tick"); } doSomething(); setInterval(doSomething, 9000); 如有必要,请创建范围: (function
  • “后期绑定关闭”是什么意思? [复制](What dose “late binding closures” mean? [duplicate])
    问题 这个问题在这里已经有了答案: 词法闭包是如何工作的? (10 个回答) 5年前关闭。 我有 C++ 的背景,并试图学习一些 Python。 虽然我了解 C++ 的虚函数,但不幸的是我不明白 python 中闭包的后期绑定是什么意思。 链接:https://gist.github.com/deemson/8efabf56d67623ead804(不再有效) 从教程复制粘贴: functions = [] for n in [1, 2, 3]: def func(x): return n*x functions.append(func) # You would expect this to print [2, 4, 6] print( 'calling a list of bad closures and output is: {}' .format(str([function(2) for function in functions])) ) 这里到底发生了什么? 当函数被添加到列表中时,它有什么值? 有人可以简化这段代码让我理解吗? 回答1 请注意,您可以在运行时创建函数,或多或少类似于 C++ 中的lambdas 。 所以基本上你正在迭代一个列表,让n取值1,2 and 3 for n in [1, 2, 3]: def func(x): return n*x 因此
  • 每个 Python 函数最后都必须返回吗? [复制](Does every Python function have to return at the end? [duplicate])
    问题 这个问题在这里已经有了答案: 是否可以不从python中的函数返回任何内容? (5 个回答) 在python中,如果一个函数没有return语句,它返回什么? (4 个回答) 返回,返回无,根本不返回? (5 个回答) 4年前关闭。 所以我正在制作一个递归函数的图表来围绕递归,我注意到显然每个函数最后都执行 return ? 另一个问题,函数究竟返回什么? 传递给它的所有参数(假设有多个参数)? 或者某种价值? (t 只是一个执行实际绘图的实体) def koch(t, n): """Draws a koch curve with length n.""" if n<30: fd(t, n) return m = n/3.0 koch(t, m) lt(t, 60) koch(t, m) rt(t, 120) koch(t, m) lt(t, 60) koch(t, m) 回答1 所以我正在制作一个递归函数的图表来围绕递归,我注意到显然每个函数最后都执行 return ? 返回本身只是意味着调用帧从调用堆栈中弹出,程序计数器被设置回调用之前的状态,等等。根据您的评论,它看起来有点像“回溯”,但请注意- 与回溯相反 - 函数具有的副作用不会恢复/撤消。 例如,追加到列表、画线、写入文件等都不会恢复。 这是递归中所需的行为。 现在有时返回某个值很有用。 例如: def foo(x
  • python函数的默认参数仅被评估一次? [复制](python function default parameter is evaluated only once? [duplicate])
    问题 这个问题已经在这里有了答案: “最少惊讶”和可变默认参数(32个答案) 4年前关闭。 我是python初学者,正在阅读“ python教程”,它说我们是否具有以下功能: def f(a, L=[]): L.append(a) return L print f(1) print f(2) print f(3) 这将打印 [1] [1, 2] [1, 2, 3] 因为默认值仅被评估一次,并且list是可变对象。 我能理解 它说继续,如果我们不希望在后续调用之间共享默认值,我们可以: def f(a, L=None): if L is None: #line 2 L = [] L.append(a) return L print f(1) print f(2) print f(3) 这将输出: [1] [2] [3] 但是为什么呢? 如何解释这一点。 我们知道默认值仅被评估once ,并且当我们调用f(2)时,L不是None,并且if (在第2行中)不能为true,那么L.append(a)== [1,2]。 我是否可以因为某种原因再次评估默认值,但是什么是“某种原因”,仅仅是因为python解释器看到if L is None: L = [] 回答1 Python通过值将参数传递给函数; 因此,对于对象,传递的值是对对象的引用,而不是对象的新副本。 那
  • 如何让`bin(30)`返回`00011110`而不是`0b11110`? [复制](How can I make `bin(30)` return `00011110` instead of `0b11110`? [duplicate])
    问题 这个问题在这里已经有了答案: Python int 到二进制字符串? (36 个回答) 1 年前关闭。 bin(30): "0b11110" 的输出中的 "b" 代表什么? 有什么办法可以摆脱这个“b”? 如何让 bin() 的输出始终返回标准的 8 位输出? 回答1 使用 zfill(): 返回在长度和宽度的字符串中用零填充的数字字符串。 正确处理符号前缀。 如果宽度小于 len(s),则返回原始字符串。 >>> bin(30)[2:].zfill(8) '00011110' >>> 回答2 0b 就像 0x - 它表示数字格式为二进制(0x 表示数字为十六进制)。 请参阅如何在 python 中表达二进制文字? 请参阅 http://docs.python.org/dev/whatsnew/2.6.html#pep-3127-integer-literal-support-and-syntax 要去除 0b,最简单的方法是使用字符串切片: bin(30)[2:] 同样,对于 8 个字符宽的格式: ('00000000'+bin(30)[2:])[-8:] 或者,您可以使用字符串格式化程序(在 2.6+ 中)一步完成所有操作: "{0:08b}".format(30) 回答3 利用著名的format()函数和鲜为人知的第二个参数并将其与zfill() 'b' - 二进制'x
  • 将代码推迟以供稍后在python中执行(例如javascript中的setTimeout)。(Postpone code for later execution in python (like setTimeout in javascript) [duplicate])
    问题 这个问题已经在这里有了答案: Python时间延迟(2个答案) 2年前关闭。 我必须在python中执行一个程序,该程序需要执行一段时间,然后(无论在何处执行)它都必须将信息转储到文件中,关闭文件,然后退出。 在JavaScript中,此行为与使用setTimeout(func, 1000000)等效,其中其第一个参数(func)将是具有退出代码的函数的指针,而其第二个参数将是程序可以执行的时间。 我知道如何用C(使用SO信号)制作此程序,但是使用python 回答1 在实践中,计时器可能是您想要做的最简单的方法。 该代码将执行以下操作: 1秒后,它会显示“ arg1 arg2” 2秒后,它会显示“ OWLS OWLS OWLS” === from threading import Timer def twoArgs(arg1,arg2): print arg1 print arg2 print "" def nArgs(*args): for each in args: print each #arguments: #how long to wait (in seconds), #what function to call, #what gets passed in r = Timer(1.0, twoArgs, ("arg1","arg2")) s = Timer(2.0
  • 为什么我必须键入 ctrl-d 两次? [复制](Why do I have to type ctrl-d twice? [duplicate])
    问题 这个问题在这里已经有了答案: 为什么我必须按 Ctrl+D 两次才能关闭标准输入? (5 个回答) 7年前关闭。 为了我自己的娱乐,我编写了一个 python 脚本,它允许我将 python 用于 bash one-liners; 提供一个python生成器表达式; 并且脚本对其进行迭代。 这是脚本: DEFAULT_MODULES = ['os', 're', 'sys'] _g = {} for m in DEFAULT_MODULES: _g[m] = __import__(m) import sys sys.stdout.writelines(eval(sys.argv[1], _g)) 这是您可以使用它的方式。 $ groups | python pype.py '(l.upper() for l in sys.stdin)' DBORNSIDE $ 对于预期用途,它完美无缺! 但是当我不使用管道提供它而直接调用它时,例如: [强调显示我输入的内容] $ python pype.py '("%r\n" % (l,) for l in sys.stdin)' fooEnter barEnter bazEnter Ctrl DCtrl D'foo\n' 'bar\n' 'baz\n' $ 为了停止接受输入并产生任何输出,我必须输入 Enter - Ctrl D -
  • 从python中的元组列表中删除重复项的函数(Function to remove duplicates from a list of tuples in python)
    问题 在函数 sqlPull() 中,我每 5 秒从 MySQL 数据库中提取最近的 5 个条目。 在第二个函数 dupCatch() 中,与 n 相比,我试图删除在 n+1 SQL pull 中会出现的重复项。 我只想保存唯一的元组列表,但现在该函数每五秒打印 5 次相同的元组列表。 在英语中,我试图用 dupCatch() 做的是从 sqlPull() 中获取数据,初始化和空列表,并说对于变量数据中的所有元组,如果该元组不在空列表中,则将其添加到newData 变量,如果不是,则将 lastPull 设置为等于非唯一元组。 显然,我的函数是错误的,但我不确定如何修复它。 import mysql.connector import datetime import requests from operator import itemgetter import time run = True def sqlPull(): connection = mysql.connector.connect(user='XXX', password='XXX', host='XXXX', database='MeshliumDB') cursor = connection.cursor() cursor.execute("SELECT TimeStamp, MAC, RSSI FROM
  • Why doesn't setTimeout wait to call a function?
    问题 我想创建一个简单的游戏。 我试图在几秒钟后递归地复制一个 div。 复制后,它使用新的唯一 ID (ID+i) 创建新的 div。 这个想法是它不断创建 div,并且用户必须在达到最大值(游戏结束)之前尽可能长时间地单击它们以将其删除。 它不会正确等待创建 div。 我想每隔几秒钟从现有的 div 创建新的 div,但它要么在我运行它时创建所有 15 个,要么只创建 1 个并停在那里。 JSFIDDLE - https://jsfiddle.net/namelesshonor/msrkxq63/ function spawnFly() { if(x >= 15){ alert("YOU LOST\n15 Flys have infested your screen!"); } else if(x < 15) { x++; // adds another fly to the counter setTimeout(duplicate(), 2000); // spawns a new fly after a few secs animateDiv(); // animate the spawned fly spawnFly(); // called recursively until fly count is met } }; function duplicate() {
  • Python 中的列表推导式和 lambdas [重复](List comprehension and lambdas in Python [duplicate])
    问题 这个问题在这里已经有了答案: 嵌套函数中的局部变量4 个回答 3年前关闭。 我想创建一个 lambda 列表,但它并没有像我希望的那样成功。 L = [(lambda x: x/y) for y in range(10)] 我希望列表中的每个函数都将其参数除以它的索引,但所有函数只除以最后一个索引。 >>> L[1](5) 0.5555555555555556 >>> L[5](5) 0.5555555555555556 >>> 5/9 0.5555555555555556 在 Python 中,每个 lambda 都有自己的y副本,这种列表推导式是否可行? 回答1 lambda 中的y指的是y在它来自的范围内的最后一个值,即 9。 获得所需行为的最简单方法是在 lambda 中使用默认参数: lambda x, y=y: x/y 这将在定义 lambda 函数时捕获y的值。 你也可以做一个“双 lambda”,调用一个返回你想要的 lambda 的函数,传入y的期望值: (lambda y: lambda x: x/y)(y) 在这里,每次调用外部 lambda 时都会提供一个新的作用域。 回答2 您需要循环和 lambda 处于不同的范围内。 def make_divider(y): return lambda x: x / y L = [make_divider(y)
  • matplotlib.pyplot / pylab在使用ipython -pylab进行isinteractive()时不更新图形(matplotlib.pyplot/pylab not updating figure while isinteractive(), using ipython -pylab [duplicate])
    问题 这个问题已经在这里有了答案: python 2中的pylab.ion(),matplotlib 1.1.1和程序运行时图的更新(2个答案) 6年前关闭。 关于matplotlib,pylab,pyplot,ipython的问题很多,所以如果您厌倦了看到这个问题,对不起。 我将尽我所能,因为我一直在研究人们的问题并查看pyplot和pylab的文档,但我仍然不确定自己做错了什么。 在代码上: 目标:每0.5秒绘制一个图形,并在调用plot命令后立即更新该图形。 我尝试对此进行编码(在ipython -pylab上运行): import time ion() x=linspace(-1,1,51) plot(sin(x)) for i in range(10): plot([sin(i+j) for j in x]) #see ** print i time.sleep(1) print 'Done' 它可以正确绘制每条线,但要等到退出for循环后才能绘制。 我尝试通过将draw()放在**来强制重绘,但这似乎也不起作用。 理想情况下,我想让它简单地添加每一行,而不是进行完整的重绘。 但是,如果需要重绘,那很好。 解决问题的其他尝试: 在ion() ,尝试添加hold(True)无济于事。 对于踢尝试show()为** 我找到的最接近答案的答案是在不妨碍执行的情况下绘制线条
  • Can a Python function remember its previous outputs? [duplicate]
    This question already has answers here: What is the Python equivalent of static variables inside a function? (27 answers) Closed 2 years ago. Is there a way that a function can remember its previous output and use that value during the next call to the function? For instance, assume there is a function, runningTotal with a single argument x that returns x on the first call to runningTotal but x + prevOutput for every call after that. Is there a way to write such a function in python? I am aware that this could be easily achieved by using a global variable in the function or by saving the