2014-02-07 1 views
2

저는 약 1 주일 동안이 질문에 어려움을 겪었습니다. 몇 분 안에 대답을 부를 수있는 사람에게 물어볼 시간입니다.기존 루프를 종료하지 않고 작업을 예약하는 방법은 무엇입니까?

저는 10 초마다 한 번씩 파이썬 프로그램을 실행하려고합니다. 이 이런 종류의 질문을 많이 있습니다 작동합니다 sched 또는 time.sleep를 사용하여 Use sched module to run at a given time, Python threading.timer - repeat function every 'n' seconds, 일반적으로 솔루션 How to execute a function asynchronously every 60 seconds in Python?

은,하지만 난 이미 while False 루프에서 실행되는 cmd2 내에서 예약 프로세스를 시작하려합니다 . (cmd2을 종료하면이 루프가 종료됩니다.)

이 때문에 10 초마다 반복되는 기능을 시작하면 cmd2 내에 중첩 된 다른 루프를 입력하고 cmd2 명령을 입력 할 수 없습니다. 함수를 반복하는 하위 루프를 끝내면 cmd2으로 돌아갈 수 있으며 따라서 함수는 반복을 중지합니다.

분명히 스레딩이이 문제를 해결합니다. 나는 성공하지 않고 threading.Timer을 시도했다. 아마도 진짜 문제는 스레드 또는 다중 처리를 이해하지 못한다는 것입니다.

import cmd2 
    import repeated 

    class prompt(cmd2.Cmd): 
    """this lets you enter commands""" 

     def default(self, line): 
      return cmd2.Cmd.default(self, line) 

     def do_exit(self, line): 
      return True 

     def do_repeated(self, line): 
      repeated.func_1() 

repeated.py는 다음과 같습니다 :

다음

내가 일을하는 데 sched 모듈을 사용하여, 내가 사용하는 코드와 거의 동형 코드의 예입니다
import sched 
    import time 

    def func_2(sc): 
     print 'doing stuff' 
     sc.enter(10, 0, func_2, (sc,)) 


    def func_1(): 
     s = sched.scheduler(time.time, time.sleep) 
     s.enter(0, 0, func_2, (s,)) 
     s.run() 

답변

1

을 곧 내가 그것을 알아낼 수 있었다 질문을로 . 왜 그런 일이 발생하는지 모릅니다.

이 코드

여기에서
def f(): 
    # do something here ... 
    # call f() again in 60 seconds 
    threading.Timer(60, f).start() 

# start calling f now and every 60 sec thereafter 
f() 

: How to execute a function asynchronously every 60 seconds in Python?

이 실제로 내가 할 노력했다 작동합니다. threading.Timer에서 함수가 인수로 호출되는 방법에는 분명히 약간의 미묘한 차이가 있습니다. 전에 인수와 심지어 괄호를 함수 뒤에 넣으면 재귀적인 깊이 오류가 발생했습니다. 이 기능은 지연없이 끊임없이 호출되었습니다.

다른 사람이 이와 같은 문제가있는 사람은 threading.Timer(60, f).start()에서 함수를 호출하는 방법에주의하십시오. threading.Timer(60, f()).start() 또는 비슷한 것을 쓰면 아마 작동하지 않을 것입니다.

2

http://docs.python.org/2/library/queue.html?highlight=queue#Queue

수는 예를 CMD2의 외부 큐 개체를? 대기열을 감시하고 주기적으로 대기열에서 작업을 가져 오는 스레드가 하나있을 수 있습니다. cmd2는 자유롭게 실행되거나 실행되지 않습니다. 대기열을 처리하는 스레드와 대기열 객체 자체는 물론 외부 범위에 있어야합니다.

특정 시간에 일정을 예약하려면 대상 시간을 포함하는 튜플을 삽입 할 수 있습니다. 아니면 일정한 간격으로 스레드를 확인해도됩니다.

[당신이 반복하도록 구성되는 프로세스가있는 경우 편집, 당신은 그것이 작동 년대 말에 자신을 다시 대기 할 수 있습니다.]

+0

감사합니다. 저는 큐를 알지 못했습니다. 내가 원하는 것을 할 수있는 것처럼 보입니다. 그러나, 나는 threading.Timer (그것을 사용하는 답변의 수를 판단하는 선호되는 방법입니다)와 간단한 방법을 발견하고 그것을 아래에 설명했습니다. – Wapiti

관련 문제