当前位置: 首页 > 面试题库 >

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

孟智志
2023-03-14
问题内容

我必须在python中执行一个程序,该程序需要执行一段时间,然后(无论在何处执行)它必须将信息转储到文件中,关闭文件,然后退出。

在JavaScript中,此行为等同于使用setTimeout(func, 1000000)其第一个参数(func)将是具有退出代码的函数的指针,而其第二个参数将是程序可用的时间的用法。

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


问题答案:

在实践中,计时器可能是您要做的最简单的方法。

此代码将执行以下操作:

  • 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。

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

一旦有了包含函数调用和超时的对象,只需定期检查函数是否准备就绪即可执行。

正确的方法是使优先级队列存储我们将来要运行的所有功能,如下面的代码所示。

就像在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循环中进行更多操作,而不仅仅是检查超时功能是否准备就绪。您可能正在轮询用户输入,控制某些硬件,读取数据等。



 类似资料:
  • 我想和JDA做一个不和谐的赠品机器人。对我来说,在文件或其他地方保存条目是没有问题的,但是如何在3天后选择获胜者呢?它听起来不是很有效,使用定时器任务或保存到一个文件中的日期,并检查它每发送消息? 你不需要给我一个代码示例,但是一个简短的解释就足够了

  • 我想在我的小部件构建完成后,在一定的延迟后执行一个函数。在Flatter中,这样做的惯用方法是什么? 我试图实现的是:我想从默认的FlutterLogo小部件开始,然后在一段时间后更改其样式属性。

  • 问题内容: 由于某些原因,我必须运行一个php脚本才能从Python获取图像。因为php脚本很大,而且不是我的,所以我需要几天的时间才能找到所使用的正确算法并将其转换为python。 我想知道是否有任何方法可以运行带有少量参数的php脚本,以返回python中的图像。 问题答案: 示例代码:

  • 本文向大家介绍以下代码的执行顺序?相关面试题,主要包含被问及以下代码的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: //输出2,6,5,3,4,1 为什么呢?具体请参考我的文章: 从promise、process.nextTick、setTimeout出发,谈谈Event Loop中的Job queue

  • 问题内容: 我实质上是试图浏览html文件的文件夹。我想将它们嵌入到二进制文件中,并能够根据请求解析它们以用于模板执行目的。(如果我的措词不正确,请原谅)。 任何想法,技巧,窍门或实现此目的的更好方法将不胜感激。 问题答案: 我使用大多数Go Web应用程序执行此操作。我使用go-bindata从要嵌入的所有文件中自动生成Go源代码,然后将其编译为二进制文件。所有这些都是在构建过程中自动完成的。

  • 本文向大家介绍如何在Python中执行包含Python代码的字符串?,包括了如何在Python中执行包含Python代码的字符串?的使用技巧和注意事项,需要的朋友参考一下 如果要执行Python语句,可以使用exec(string)。例如, 但是,如果您只想评估表达式的值,则可以使用。例如,  注意:同时使用eval和exec时请务必谨慎,因为它们是非常强大的功能 并可能在您的代码中引起非常细小的

  • 问题内容: 今天,我一直在尝试使用SQL二进制对象。我首先将图像存储在表中,向图像进行base64编码的AJAX请求,然后与之一起显示。 图像显示良好。 我正在处理的Web项目也需要文件下载(主要是PDF)-太好了,我想,我也将PDF存储为SQL二进制对象,以相同的方式从服务器收集它,然后以某种方式神奇地解码在另一端下载。 帮助! 我首先尝试使用jQuery base64解码器(https://g

  • 我正在使用放心进行API测试自动化。我想在调用API后将响应存储为对象,这样我就可以使用该对象验证一些数据,如状态代码、正文、标题等。 我试着使用但它只允许存储字符串,如果将响应存储为类似字符串的并尝试检索