我有这个程序:
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。:这段代码只是一个例子,重点是我想在一定条件下暂停一段时间一段时间。
答案 0 :(得分:0)
大致是:
答案 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检查或其他状态更改之前,您才会睡觉。
这为您提供了有关游戏中延迟,一致性,可预测性和其他时间特征的最佳表现。