首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >控制回路的速度

控制回路的速度
EN

Stack Overflow用户
提问于 2014-04-23 10:48:12
回答 3查看 3.7K关注 0票数 3

我现在在大学里读物理,我把学习巨蟒作为一个小爱好。

为了同时练习这两者,我想我会写一个小的“物理引擎”,它根据x,y和z坐标来计算物体的运动。我只会以文本形式返回这个运动(至少现在是这样!)但我想要职位实时更新。

要做到这一点,我需要更新对象的位置,比如每秒100次,然后将其打印回屏幕上。因此,每10毫秒,程序打印当前的位置。

因此,如果计算的执行需要2ms,那么循环必须等待8ms才能打印并重新计算下一个位置。

构建这样一个循环的最佳方法是,每秒100次是一个公平的频率,或者你会慢慢来,比如25次/秒?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-23 11:34:16

在python中等待的基本方法是import time并使用time.sleep。那么问题是,睡多长时间?这取决于您希望如何处理循环错过所需时间的情况。如果未命中,下面的实现将试图赶上目标间隔。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
import random

def doTimeConsumingStep(N):
    """
    This represents the computational part of your simulation.

    For the sake of illustration, I've set it up so that it takes a random
    amount of time which is occasionally longer than the interval you want.
    """
    r = random.random()
    computationTime = N * (r + 0.2)
    print("...computing for %f seconds..."%(computationTime,))
    time.sleep(computationTime)


def timerTest(N=1):
    repsCompleted = 0
    beginningOfTime = time.clock()

    start = time.clock()
    goAgainAt = start + N
    while 1:
        print("Loop #%d at time %f"%(repsCompleted, time.clock() - beginningOfTime))
        repsCompleted += 1
        doTimeConsumingStep(N)
        #If we missed our interval, iterate immediately and increment the target time
        if time.clock() > goAgainAt:
            print("Oops, missed an iteration")
            goAgainAt += N
            continue
        #Otherwise, wait for next interval
        timeToSleep = goAgainAt - time.clock()
        goAgainAt += N
        time.sleep(timeToSleep)

if __name__ == "__main__":
    timerTest()

请注意,您将错过您想要的时间在一个正常的操作系统,所以这样的事情是必要的。请注意,即使使用像郁金香和twisted这样的异步框架,也不能保证正常操作系统上的定时。

票数 2
EN

Stack Overflow用户

发布于 2014-04-23 11:10:28

因为您无法预先知道每次迭代需要多长时间,所以需要某种事件驱动的循环。一个可能的解决方案是使用基于twisted反应堆模式模块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from twisted.internet import task
from twisted.internet import reactor

delay = 0.1

def work():
    print "called"

l = task.LoopingCall(work)
l.start(delay)

reactor.run()

然而,正如已经指出的,不要期望一个真正的实时响应.

票数 2
EN

Stack Overflow用户

发布于 2014-04-23 11:04:24

一条警告。在非实时系统上,您可能不会期望实时。sleep系列的呼叫至少保证了给定的延迟,但很可能会延迟更多的时间。

因此,一旦您从睡眠中返回,查询当前时间,并将计算转换为“未来”(计算时间)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23252796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文