gpt4 book ai didi

python - 推迟代码以供以后在 python 中执行(如 javascript 中的 setTimeout)

转载 作者:IT老高 更新时间:2023-10-28 22:02:07 26 4
gpt4 key购买 nike

我必须在 python 中做一个程序,它需要执行一段时间,然后(不管它在哪里执行)它必须将信息转储到文件中,关闭文件然后退出。

这里的行为在 JavaScript 中等同于使用 setTimeout(func, 1000000),其中它的第一个参数 (func) 是指向带有退出代码的函数的指针,它的第二个参数是程序执行的可用时间。

我知道如何用 C 语言(使用 SO 信号)但使用 python 制作这个程序

最佳答案

在实践中,Timer可能是做你想做的最简单的方法。

此代码将执行以下操作:

  • 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, nArgs, ("OWLS","OWLS","OWLS"))

r.start()
s.start()

===

上面的代码很可能会解决你的问题。

但是!还有另一种方法,即不使用多线程。它的工作原理更像是单线程的 Javascript。

对于这个单线程版本,您需要做的就是将函数及其参数以及函数应该运行的时间存储在一个对象中。

一旦您拥有包含函数调用和超时的对象,只需定期检查该函数是否已准备好执行。

执行此操作的正确方法是创建 priority queue来存储我们将来要运行的所有函数,如下面的代码所示。

就像在 Javascript 中一样,这种方法不能保证函数会准时运行。一个需要很长时间才能运行的函数会延迟它之后的函数。但它确实保证函数将在其超时之前运行

此代码将执行以下操作:

  • 1 秒后,打印“20”
  • 2 秒后,打印“132”
  • 3 秒后退出。

===

from datetime import datetime, timedelta
import heapq

# just holds a function, its arguments, and when we want it to execute.
class TimeoutFunction:
def __init__(self, function, timeout, *args):
self.function = function
self.args = args
self.startTime = datetime.now() + timedelta(0,0,0,timeout)

def execute(self):
self.function(*self.args)

# A "todo" list for all the TimeoutFunctions we want to execute in the future
# They are sorted in the order they should be executed, thanks to heapq
class TodoList:
def __init__(self):
self.todo = []

def addToList(self, tFunction):
heapq.heappush(self.todo, (tFunction.startTime, tFunction))

def executeReadyFunctions(self):
if len(self.todo) > 0:
tFunction = heapq.heappop(self.todo)[1]
while tFunction and datetime.now() > tFunction.startTime:
#execute all the functions that are ready
tFunction.execute()
if len(self.todo) > 0:
tFunction = heapq.heappop(self.todo)[1]
else:
tFunction = None
if tFunction:
#this one's not ready yet, push it back on
heapq.heappush(self.todo, (tFunction.startTime, tFunction))

def singleArgFunction(x):
print str(x)

def multiArgFunction(x, y):
#Demonstration of passing multiple-argument functions
print str(x*y)

# Make some TimeoutFunction objects
# timeout is in milliseconds
a = TimeoutFunction(singleArgFunction, 1000, 20)
b = TimeoutFunction(multiArgFunction, 2000, *(11,12))
c = TimeoutFunction(quit, 3000, None)

todoList = TodoList()
todoList.addToList(a)
todoList.addToList(b)
todoList.addToList(c)

while True:
todoList.executeReadyFunctions()

===

在实践中,您可能会在该 while 循环中执行更多操作,而不仅仅是检查您的超时函数是否已准备就绪。您可能正在轮询用户输入、控制某些硬件、读取数据等。

关于python - 推迟代码以供以后在 python 中执行(如 javascript 中的 setTimeout),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10154568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com