循环vs异步计时器

时间:2014-11-12 03:44:22

标签: python loops asynchronous simulation

我正在进行模拟,我需要运行日/夜循环。以下是负责循环的功能:

def epoch():
    print("it is now day")
    time.sleep(varb.day_night_length)
    print("it is now night")
    time.sleep(varb.day_night_length)

varb是我制作的全局模块的名称,是一个决定白天或晚上长度的值)

事情是我不希望这个函数成为程序停止时的负责人(使for循环无效)。我不希望它是无限的,所以while循环很麻烦。我希望能够在不停止用户输入的情况下顺利运行。是否有捷径可寻?

编辑:如果我无法返回它的状态,我意识到这个循环是无用的。如何在不停止循环的情况下做到这一点?

编辑:找到我需要的东西。对于未来读这篇文章的人,你必须使用yield。它的使用方法与返回单词yield的方式完全相同。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

这是使用Unix信号的快速而肮脏的概念证明。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import signal
from time import sleep

NIGHT = 0

def toggle_night (foo, bar):
    global NIGHT
    NIGHT = 1 - NIGHT
    signal.alarm(2)

signal.signal(signal.SIGALRM, toggle_night)

signal.alarm(2)

events = ['The cows come home',
    'Time passes ...',
    'Birds chirp.',
    'Partially cloudy',
    'Cows? Where are they?',
    '... More time passes ...',
    'Here we are.']

for t, what in enumerate(events):
    print '{0} night: {1}: {2}'.format(t, NIGHT, what)
    sleep(1)

演示:

tripleee@away:~$ python /tmp/night.py
0 night: 0: The cows come home
1 night: 0: Time passes ...
2 night: 1: Birds chirp.
3 night: 1: Partially cloudy
4 night: 0: Cows? Where are they?
5 night: 0: ... More time passes ...
6 night: 1: Here we are.

我尝试了相应的setitimer内容,但无法快速完成...无论如何,所有这些都只是U * x。

答案 1 :(得分:0)

我建议threading。它打开了一个与其余代码分开的新线程,这意味着它不会停止循环。

尝试一下以下内容:

import time, threading
answer = ""
def user_input():
    answer = raw_input("Hello, how are you doing? ")
    global answer


Thread1 = threading.Thread(target = user_input)
for the_time in range(100): #Example loop
    time.sleep(2)
    print answer