2014-11-12 2 views
1

Я создаю симуляцию, где мне нужно запустить цикл день/ночь. Вот функция, которая отвечает за цикл:Loop vs асинхронный таймер

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 это имя глобального модуля я сделал и значение, которое определяет продолжительность дня и ночи)

Вещь Я не хочу, чтобы эта функция была ответственной, когда программа останавливается (делая цикл бесполезным). Я не хочу, чтобы он был бесконечным, поэтому цикл while громоздкий. Я хочу, чтобы вы могли работать плавно, не останавливаясь на вводе пользователя. Есть простой способ сделать это?

EDIT: Я понял, что этот цикл бесполезен, если я не могу вернуть его состояние. Как я могу это сделать, не останавливая цикл?

EDIT: нашел то, что мне нужно. Для будущих людей, читающих это, вы должны использовать доходность. Он используется точно так же, как и возврат с помощью слова yield.

Спасибо всем!

+0

Попробуйте 'threading' – AHuman

+0

Или несколько процессов или синхронизированные сигналы. (Я категорически отказываюсь отмечать их как «код», когда это не так.) – tripleee

+0

Я забыл упомянуть. Я также хотел бы иметь возможность «вернуть» состояние эпохи, не нарушая поток. @tripleee, как бы срабатывали срабатывания сигнализации? Это часть python? Или вторичная программа, которая мне понадобится? – unknown

ответ

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 
0

Вот быстрый и грязный доказательство концепции с использованием сигналов 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) 

Демо:

[email protected]:~$ 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 * х только.

Смежные вопросы