设置运行进程的计时器,在某些条件下暂停计时器

时间:2014-05-25 13:15:35

标签: python timer multiprocess

我有这个程序:

import multiprocessing
import time

def timer(sleepTime):
    time.sleep(sleepTime)
    fooProcess.terminate()
    fooProcess.join() #line said to "cleanup", not sure if it is required, refer to goo.gl/Qes6KX

def foo():
    i=0
    while 1 
        print i
        time.sleep(1)
        i
        if i==4:
            #pause timerProcess for X seconds

fooProcess = multiprocessing.Process(target=foo, name="Foo", args=())
timer()
fooProcess.start()

正如你在评论中看到的那样,在某些条件下(在这个例子中我必须是4),计时器必须停止一段时间,而foo()继续工作。 现在,我该如何实现呢?

N.B。:这段代码只是一个例子,重点是我想在一定条件下暂停一段时间一段时间。

4 个答案:

答案 0 :(得分:0)

大致是:

  1. 获取当前开始时间的时间戳(time.time(),我推测)
  2. 使用Event.wait(timeout = ...)
  3. 进行睡眠
  4. 在事件或超时时醒来。
  5. 如果在事件上:获取时间戳,减去初始值,从定时器中减去结果;等到foo()停止;重复Event.wait(timeout = [结果来自4.。)
  6. 如果超时:退出。

答案 1 :(得分:0)

以下是一个示例,我的理解,您的程序应该做什么:

import threading, time, datetime

ACTIVE = True

def main():
    while ACTIVE:
        print "im working"
        time.sleep(.3)

def run(thread, timeout):
    global ACTIVE
    thread.start()
    time.sleep(timeout)
    ACTIVE = False

    thread.join()


proc = threading.Thread(target = main)

print datetime.datetime.now()
run(proc, 2)  # run for 2 seconds
print datetime.datetime.now()

在main()中,它执行一个定期任务,这里打印一些东西。在run()方法中,您可以说,main应该执行多长时间。

此代码产品跟随输出:

2014-05-25 17:10:54.390000
im working
im working
im working
im working
im working
im working
im working
2014-05-25 17:10:56.495000
如果我理解你错了,请纠正我。

答案 2 :(得分:0)

我会使用multiprocessing.Pipe进行信号传输,并将select与时间结合使用:

#!/usr/bin/env python

import multiprocessing
import select
import time

def timer(sleeptime,pipe):
    start = time.time()
    while time.time() < start + sleeptime:
        n = select.select([pipe],[],[],1) # sleep in 1s intervals
        for conn in n[0]:
            val = conn.recv()
            print 'got',val
            start += float(val)

def foo(pipe):
    i = 0
    while True:
        print i
        i += 1
        time.sleep(1)
        if i%7 == 0:
            pipe.send(5)

if __name__ == '__main__':
    mainpipe,foopipe = multiprocessing.Pipe()
    fooProcess = multiprocessing.Process(target=foo,name="Foo",args=(foopipe,))
    fooProcess.start()
    timer(10,mainpipe)
    fooProcess.terminate()
    # since we terminated, mainpipe and foopipe are corrupt
    del mainpipe, foopipe
    # ...
    print 'Done'

我假设您希望foo进程中有一些条件来扩展计时器。在我设置的示例中,每次foo达到7的倍数时,它会将计时器延长5秒,而计时器最初倒计时10秒。在计时器结束时,我们终止进程 - foo根本无法完成,管道将被破坏,但你可以确定它会死掉。否则,您可以在mainpipe可以收听的foo发回信号,并在您加入时很好地退出。

答案 3 :(得分:0)

我认为你在游戏设计上犯了这个错误。游戏总是(没有例外)可以使用软件控制的主要事件循环。

每次循环都会检查时间并根据经过的时间启动所有必要的事件。在循环结束时,只有在您获得下一个计时器或事件或刷新或ai检查或其他状态更改之前,您才会睡觉。

这为您提供了有关游戏中延迟,一致性,可预测性和其他时间特征的最佳表现。