저는 60초마다 Python에서 함수를 반복 수행하고 싶습니다(Objective C의 NSTimer또는 JS의 setTimeout처럼).이 코드는 데몬에서 실행되어 cron을 사용하고 1분마다 Python스크립트를 호출하는 것과 비슷하지만 사용자가 설정할 필요는 없습니다. Python에서 구현된 cron에 관한 이 질문에서는 솔루션은 x초 동안 효과적으로 sleep() 하는 것으로 생각합니다.나는 그런 고도의 기능을 필요로 하지 않아서 아마 그런 것이 기능할 것입니다.
![]()
whileTrue:#코드는 여기서 실행됩니다.슬리프(60)
이 코드에 예측 가능한 문제가 있습니까?프로그램에 이미 이벤트 루프가 없는 경우 범용 이벤트 스케줄러를 구현하는 sched 모듈을 사용합니다.

import sched, times = sched.scheduler(time.time, time.)。sleep)def do_something(sc):print(“doing stathing…”)..”)# do your stuffs.enter(60, 1, do_something, (sc, )s.enter(60, 1, do_something, (s,))s.run ()
asyncio, trio, tkinter, PyQt5, gobject, kivy 등의 이벤트 루프 라이브러리를 이미 사용하고 있는 경우에는 대신 기존 이벤트 루프 라이브러리의 메서드를 사용하여 작업을 예약합니다.

asyncio, trio, tkinter, PyQt5, gobject, kivy 등의 이벤트 루프 라이브러리를 이미 사용하고 있는 경우에는 대신 기존 이벤트 루프 라이브러리의 메서드를 사용하여 작업을 예약합니다.
그것과 cron의 주요 차이점은 예외가 데이먼을 영원히 죽인다는 점입니다. 예외 포수나 로거로 포장할 수 있습니다.

그것과 cron의 주요 차이점은 예외가 데이먼을 영원히 죽인다는 점입니다. 예외 포수나 로거로 포장할 수 있습니다.
Reactor Pattern을 구현하는 Python 네트워킹 라이브러리인 Twisted를 생각할 수 있습니다.

뒤틀린 상태에서.internet import task, reactor timeout=60.0#60초 def doWork():#do workhere passl=task.LoopingCall(doWork)l.start(timeout)#60초마다 콜reactor.run()
“while True:sleep(60)”이 동작할 수 있지만 Twisted는 아마도 궁극적으로 필요한 많은 기능(bobince가 지적한 데몬화, 로깅 또는 예외 처리)을 이미 구현하여 아마도 더 강력한 솔루션이 될 것입니다.”while True:sleep(60)”이 동작할 수 있지만 Twisted는 아마도 궁극적으로 필요한 많은 기능(bobince가 지적한 데몬화, 로깅 또는 예외 처리)을 이미 구현하여 아마도 더 강력한 솔루션이 될 것입니다.함수를 주기적으로 실행하는 차단 방법을 원하면 무한 루프를 차단하는 대신 쓰레드 타이머를 사용합니다.이에 따른 코드가 계속 실행되고 다른 작업을 실행할 수 있고 여전히 n초 만에 함수가 호출됩니다.나는 길고 CPU/디스크/네트워크 집약적인 작업에 대한 진행 정보를 인쇄하는데 이 기술을 많이 씁니다.다음은 start()및 stop()컨트롤을 사용하여 비슷한 질문에 게시한 코드입니다.from threading importTimerclass RepeatedTimer(object):def__init__(self, interval, function,*args,*kwargs):self입니다._timer=none self입니다.interval=interval self입니다.function=function self.args=args self.kwargs=kwargs self.is_running=false self.start def_run(self):self.is_running=false self.start()self입니다.function(*self.args,**self.kwargs)def start(self):self.is_running:self이 아닌 경우는 self입니다._timer=타이머(self.interval, self)입니다._run)자기입니다._timer.start()self.is_running=True def stop(self):self입니다._timer.cancel()self.is_running=False입니다용법.from time import sleepdef hello(name):print”Hello%s!”%nameprint”starting…”. rt=RepeatedTimer(1, hello,”World”)#it auto-starts, rt.start()try:sleep(5)#장기간의 작업이 여기에… 그렇긴 final:rt.stop()#better in try/finally block를 실행하여 프로그램이 종료함을 확인합니다!특징: 표준 라이브러리 전용, 외부 종속성 없는 start() 및 stop()은 타이머가 이미 시작/중지된 경우에도 여러 번 호출하는 것이 안전합니다.호출되는 함수는 위치와 명명된 인수를 가질 수 있습니다.interval은 언제든지 변경할 수 있으며 다음 실행 후 적용됩니다. args, kwargs, 심지어 function에 대해서도 마찬가지입니다!특징: 표준 라이브러리 전용, 외부 종속성 없는 start() 및 stop()은 타이머가 이미 시작/중지된 경우에도 여러 번 호출하는 것이 안전합니다.호출되는 함수는 위치와 명명된 인수를 가질 수 있습니다.interval은 언제든지 변경할 수 있으며 다음 실행 후 적용됩니다. args, kwargs, 심지어 function에 대해서도 마찬가지입니다!다음은 시간 경과에 따른 도리 피트를 방지하는 MestreLion의 코드 업데이트입니다.여기서 Repeated Timer클래스는 OP에서 요청한 대로”간격”초당에 주어진 함수를 호출합니다.스케줄은 함수를 실행하는데 걸리는 시간에 의해서 변경되지 않습니다.외부 라이브러리의 의존성이 없기 때문에 이 솔루션이 마음에 듭니다.이는 순수 파이썬입니다.다음은 시간 경과에 따른 드리핏을 방지하는 MestreLion의 코드 업데이트입니다.여기서 Repeated Timer 클래스는 OP에서 요청한 대로 “간격”초마다 주어진 함수를 호출합니다. 일정은 함수를 실행하는 데 걸리는 시간에 따라 변경되지 않습니다. 외부 라이브러리의 의존성이 없기 때문에 이 솔루션이 마음에 듭니다. 이것은 순수한 파이썬입니다.샘플 사용법(MestreLion 답변에서 복사):from time import sleepdef hello(name):print”Hello%s!”%nameprint”starting…””. rt=RepeatedTimer(1, hello,”World”)#it auto-starts, rt.start()try:sleep(5)#장기간의 작업은 여기에서 실행됩니다···마지막으로:rt.stop()#better in try/finally block를 실행하여 프로그램이 종료함을 확인합니다!from time import sleepdef hello(name): print “Hello %s!” % nameprint “starting…”.rt = Repeated Timer(1, hello, “World”) # it auto-starts, rt.start () try:sleep(5) # 장기간의 작업은 여기서 실행됩니다···마지막으로: rt.stop () #betterin try/finally block을 실행하고, 프로그램이 종료하는 것을 확인합니다!from time import sleepdef hello(name): print “Hello %s!” % nameprint “starting…”.rt = Repeated Timer(1, hello, “World”) # it auto-starts, rt.start () try:sleep(5) # 장기간의 작업은 여기서 실행됩니다···마지막으로: rt.stop () #betterin try/finally block을 실행하고, 프로그램이 종료하는 것을 확인합니다!나는 이것을 사용하여 시간당 60개의 이벤트를 발생시키고 대부분의 이벤트는 전체의 1분 후 같은 시간(초)에 발생합니다.나는 이것을 사용하여 시간당 60개의 이벤트를 발생시키고 대부분의 이벤트는 전체의 1분 후 같은 시간(초)에 발생합니다.실제 조건에 따라 다음과 같은 길이가 표시될 수 있습니다.60,60,62,58,60,60,120,30,30,60,60,60,60,60…etc.그러나 60분이 끝나면 60매틱을 수 있습니다.그리고 대부분은 희망하는 분의 정확한 오프셋에서 발생합니다.내 시스템에서는 수정이 필요할 때까지 1/20초 미만의 일반적인 유동이 발생합니다.이 방법의 이점은 클락드리프트의 분해능입니다.1매틱당 1개 항목을 추가하는 것 같은 작업을 하고 1시간당 60개의 항목이 추가된다고 예상될 경우 문제가 발생할 수 있습니다.드리프트를 고려하지 않으면 이동 평균과 같은 두차 표시가 데이터를 너무 과거와 간주, 잘못된 출력을 초래할 가능성이 있습니다.하지만 60분이 끝나면 60틱이 생깁니다. 그리고 대부분은 원하는 쪽의 정확한 오프셋에서 발생합니다.제 시스템에서는 수정이 필요할 때까지 1/20초 미만의 일반적인 드리프트가 발생합니다.이 방법의 장점은 클럭 드리프트의 분해능입니다. 틱 당 1개의 항목을 추가하는 것과 동일한 작업을 수행하며, 시간당 60개의 항목이 추가될 것으로 예상되는 경우 문제가 발생할 수 있습니다. 드리프트를 고려하지 않으면 이동평균과 같은 2차 표시가 데이터를 너무 깊게 과거로 간주해 잘못된 출력을 초래할 수 있습니다.한 가지 가능한 대답:import time=time.time () while True:if time.time ()-t>10: #run your task here t=time.time ()import time=time.time () while True:if time.time ()-t>10: #run your task here t=time.time ()import time=time.time () while True:if time.time ()-t>10: #run your task here t=time.time ()예: 현재 현지 시간 표시import datetime import glib import logger det_local_time():current_time=datetime.datetime.now(“%H:%M”)str(“current_time”)return str(current_time)def display_local_time():logger.info(“현재 시각은:%s”, get_localevery minutrue#call glibutevery minutevery, display_local_time)을 표시합니다import datetime import glib import logger det_local_time (): current_time = datetime.datetime.now(“%H:%M”) str(“current_time”)return str(current_time)def display_local_time (): logger.info (” 現在の時刻は:%s”, get_localevery minutrue# call glibutevery minutevery、 display_local_time) を表示しますimport datetime import glib import logger det_local_time (): current_time = datetime.datetime.now(“%H:%M”) str(“current_time”)return str(current_time)def display_local_time (): logger.info (” 現在の時刻は:%s”, get_localevery minutrue# call glibutevery minutevery、 display_local_time) を表示します나는 Tkinter after() 메소드를 사용합니다. 이 메서드는 “게임을 훔치는” 일이 없습니다(이전에 제공된 sched 모듈처럼). 즉, 다른 작업을 병렬로 실행할 수 있습니다.import Tkinterdef do_something1():n1==6:#(옵션 조건)print”*do_something1()is done*”;return#Do your stuff here#…print”do_something1()”+str(n1)tk.after(1000, do_something1)def do_something2():n2==6:#(옵션 조건)print”*do_something2()is done*”;return#Do your stuff here#…print”do_something2()”+str(n2)tk.after(500, do_something2)tk=Tkinter.Tk();n1=0;n2=0do_something1()do_something2()tk.mainloop()do_something1()및 do_something2()는 병렬 및 간격 속도에 관계 없이 실행할 수 있습니다.여기에서 2번째 것은 2배 빠른 실행됩니다.또 양쪽의 기능 중 하나를 종료하기 위한 조건으로 간단한 카운터를 사용했습니다.프로그램이 끝날 때까지(예를 들어 시계)어떤 기능을 실행할지를 원할 경우 다른 조건을 사용하거나 사용하지 않을 수 있습니다.do_something 1() 및 do_something 2()는 병렬 및 간격 속도에 관계없이 실행할 수 있습니다. 여기서 두 번째 것은 2배 빠르게 실행됩니다. 또한 두 기능 중 하나를 종료하기 위한 조건으로 간단한 카운터를 사용했습니다. 프로그램이 종료될 때까지(예를 들어 시계) 어떤 기능을 수행할지를 원하는 경우 다른 조건을 사용하거나 사용하지 않을 수 있습니다.import time, tracebackdef every(delay, task):next_time=time.time()+delay while True:time입니다.sleep(max(0, next_time-time.time()try:task()exception:traceback.print_exc()#물론 실제 코드가 아니라 이게 갖고 싶을지도 모릅니다:#logger.exception(“반복 태스크의 실행 중에 문제가 발생했습니다.”)#스케줄에 늦는 경우는 작업을 스킵 합니다:next_time+=(time).time()-next_time)//delay*delay+delay def foo():print(“foo”, time.time()every(5, foo)나머지 코드를 차단하지 않고 이 작업을 수행하려면 이를 사용하여 자체 스레드에서 실행되도록 할 수 있습니다.스레드를 가져옵니다.スレッド (target=lambda: every(5, foo))。start()이 솔루션은 다른 솔루션에서는 거의 볼 수 없는 몇가지 기능을 결합합니다.예외 처리:이 차원에서 가능한 예외가 제대로 처리됩니다.즉, 프로그램을 중단하지 않고 디버깅 목적으로 기록됩니다.체인 없음:대다수 응답에 보인다 일반적인 체인과 유사한 구현(다음의 행사 예약용)은 스케줄링 메커니즘(threading.Timer또는 기타)내에서 문제가 발생하면 체인이 종료된다는 측면에서 취약입니다.문제의 원인이 이미 수정되고 있다면 그것은 실행되지 않게 됩니다.간단한 고리와 간단한 슬리프()에서 기다리는 게 비교에 훨씬 강력하죠.드리프트 없음:저의 솔루션은 실행되어야 하는 시간을 정확히 추적합니다.다른 많은 솔루션과 마찬가지로 실행 시간에 의한 드리프트는 없습니다.스킵:1회 실행 시간이 너무 걸리면 나의 솔루션은 태스크를 스킵 합니다(예:5초마다 X를 실행합니다만, X는 6초 걸린다).이는 표준 cron동작입니다(그리고 그만한 이유가 있습니다).다른 많은 솔루션은 지체 없이 작업을 여러 차례 연속으로 실행합니다.많은 경우(예:정리 작업), 이는 원하지 않아요.원하시는 경우 대신 next_time+=delay를 사용하세요.이 솔루션은 다른 솔루션에서는 거의 볼 수 없는 몇 가지 기능을 결합합니다.예외 처리: 이 수준에서 가능한 한 예외가 올바르게 처리됩니다. 즉, 프로그램을 중단하지 않고 디버깅 목적으로 기록됩니다.체인 없음: 많은 응답에서 볼 수 있는 일반적인 체인과 유사한 구현(다음 이벤트 예약용)은 스케줄링 메커니즘(threading.Timer 또는 기타) 내에서 문제가 발생하면 체인이 종료된다는 측면에서 취약합니다. 문제의 원인이 이미 수정된 경우에도 그것은 실행되지 않게 됩니다. 간단한 루프와 간단한 슬립으로 기다리는 편이 비교적 강력합니다.드리프트 없음: 제 솔루션은 실행되어야 할 시간을 정확하게 추적합니다. 다른 많은 솔루션과 마찬가지로 실행 시간에 따른 드리프트는 없습니다.스킵: 1회 실행에 너무 오래 걸리면 제 솔루션은 작업을 스킵합니다(예: 5초마다 X를 실행하지만, X는 6초 걸린다). 이것은 표준의 cron 동작입니다(그리고 그럴만한 이유가 있습니다). 다른 많은 솔루션은 지연 없이 작업을 여러 번 연속으로 수행합니다. 대부분의 경우(예: 정리 작업), 이것은 원하지 않습니다. 희망하시는 경우는 대신 next_time + = delay를 사용해 주세요.””’임포트 스렛디은그 글로벌 시간”을 인쇄하는 횟수를 추적합니다 interval count=0def printit():스렛디은그입니다.타이머(timeInterval, 인쇄합니다). start()print(“Hello, World!”)global count count=count+1print(count)printitif__name__==”__main__”:timeInterval=int(input(‘Enter Time in Seconds:’)printit()”’ ‘”Import 스레딩 글로벌 시간”‘을 인쇄하는 횟수를 추적합니다interval count=0def printit (): 스레딩입니다.타이머(timeInterval, 인쇄합니다). start()print(“Hello, World!”) global count count=count+1print(count) printitif __name__ == “__main__” : timeInterval= int(input(‘Enter Time in Seconds:’))) printit()”’ ‘”Import 스레딩 글로벌 시간”‘을 인쇄하는 횟수를 추적합니다interval count=0def printit (): 스레딩입니다.타이머(timeInterval, 인쇄합니다). start()print(“Hello, World!”) global count count=count+1print(count) printitif __name__ == “__main__” : timeInterval= int(input(‘Enter Time in Seconds:’))) printit()다음은 MestreLion코드를 수정한 버전입니다.원래의 기능 외에 이 코드는 다음과 같습니다.1)특정 시간에 타이머를 시작하기 위해서 사용되는 first_interval추가(호출자는 first_interval을 계산하고 전달해야 한다)2)오리지널 코드에서 경쟁 조건을 해결합니다.원래의 코드로 제어 스레드가 실행 중 시간을 취소하지 못한 경우(“타이머를 중단하고 타이머 작업 실행을 취소합니다.타이머가 아직 대기 단계에 있는 경우에만 작동됩니다.”https://에서 인용)docs.python.org/2/library/threading.html)타이머가 끝도 없이 실행됩니다.아래는 MestreLion의 코드를 수정한 버전입니다.원래 기능 외에도 이 코드는 다음과 같습니다.1) 특정 시간에 타이머를 시작하기 위해 사용되는 first_interval 추가(호출자는 first_interval을 계산하여 전달해야 함) 2) 원본 코드로 경쟁 조건을 해결합니다. 원래의 코드로 제어 스레드가 실행중의 타이머를 취소할 수 없었던 경우(“타이머를 정지해, 타이머의 조작 실행을 취소합니다. 타이머가 아직 대기 단계에 있는 경우에만 작동합니다.” https://에서 인용) docs.python.org/2/library/threading.html 타이머가 끝없이 실행됩니다.classRepeatedTimer(object):def__init__(self, first_interval, interval, func,*args,*kwargs):self.timer=none self.first_interval=first_interval self.interval=interval self.func=func self.args=args self.kwargs=kwargs self.running=false self.is_started=False def first_start(self):try:#no race-condition here는 이미 기동하고 있는 경우에만 이 메소드#를 호출합니다.이는 self.is_started:self이외의 경우는 이 메소드가 기동되지 않습니다.is_started=True self.timer=타이머(self.first_interval, self.run)self.running=True self.timer.start()예외는e:log_print(syslog)입니다.LOG_ERR,”timer first_start failed%s%s”%(메시지, 역추적 등).format_exc()resendef run(self):#cancel current timer if self.running:self.timer=timer(self.interval, self.run)self.start()self.args,**self.kwargs)def stop(s):#이미 정지하고 있는 경우에도 OK. 그렇다면 다시 한번 정지해도 상관 없습니다.timer:self.timer.cancel()self.running=FalseclassRepeatedTimer(object):def __init__(self, first_interval, interval, func, *args, **kwargs): self.timer = none self.first_interval = first_interval self.interval = interval self。func = func self.args = args self.kwargs = kwargs self.running = false self.is _started = False defirst_start(self): try: #norace-condition here는 이미 시작한 경우에만 이 메서드를 호출합니다.이것은 self.is _started: self 이외의 경우는 이 메서드가 기동되지 않습니다.is_started = True self.timer = タイマー(self.first_interval, self.run) self.running = True self.timer.start () 例外は e:log_print(syslog) です.LOG_ERR, “timer first_start failed %s%s”%(메시지, 트레이스백 등).format_exc()) resendef run(self):# cancel current timer if self.running: self.timer = timer (self.interval, self.run) self.start () self.args, **self.kwargs) def stop(s):# 이미 정지해 있는 경우에도 OK#이면 다시 정지해도 됩니다.timer:self.timer.cancel() self.running = False나는 결국 스케줄 모듈을 사용했습니다. API는 좋습니다.임포트 스케줄임포트 timedef잡():print(“일을 하고 있습니다···”)schedule.every(10). minutes.do(job)schedule.every(). hour.do(job)schedule.every().day.at(“10:30”). do(job)schedule.every(job)schedule.to(10). minutes.do(job(job)every(). monday.do(job)every monday.do.every().every(job)schedule.everlyevery everseverseverseverseverse.wednesday.at(“13:15”). do(job)schedule.every().minute.at(“:17”). do(job). do(job)while True:schedule.run_pending()time입니다.sleep(1)입니다수입 일정 Import timedef 잡 ():print (“일을 하고 있습니다···”) schedule. every (10). minutes.do (job) schedule. every (). hour.do (job) schedule. every (). day.at (” 10:30″).do(job)schedule.every(job)schedule.to(10).minutes.do (job(job))every ().monday.do (job))every monday.do 。every (). .every ( (job)schedule. everlyevery everseverseverseverseverse。wednesday.at (” 13:15″).do(job)schedule.every (). minute.at (“:17”).do(job).do(job) while True: schedule.run_pending() time です.sleep (1) 입니다수입 일정 Import timedef 잡 ():print (“일을 하고 있습니다···”) schedule. every (10). minutes.do (job) schedule. every (). hour.do (job) schedule. every (). day.at (” 10:30″).do(job)schedule.every(job)schedule.to(10).minutes.do (job(job))every ().monday.do (job))every monday.do 。every (). .every ( (job)schedule. everlyevery everseverseverseverseverse。wednesday.at (” 13:15″).do(job)schedule.every (). minute.at (“:17”).do(job).do(job) while True: schedule.run_pending() time です.sleep (1) 입니다추가 라이브러리를 사용하지 않는 다른 솔루션이 있습니다.def delay_until(condition_fn, interval_in_sec, timeout_in_sec):”부울 함수를 사용하고 지연되고 있습니다.`condition_fn`는`timeout_in_sec`까지`interval_in_sec`마다 호출됩니다.조건을 만족시키면 조기에 깨질 수 있습니다.Args:condition_fn-호출 가능한 부울 함수 interval_in_sec-`condition_fn’timeout_in_sec’를 호출 동안 대기 시간-실행하기 위한 최대 시간을 갚겠습니다:없음””start=last_call=time.time()while time.time()-start<timeout_in_sec:if(time.time()-last_call)>interval_in_sec:if condition_fn()이 True:break last_call=time.time()def delay_until (condition_fn, interval_in_sec, timeout_in_sec) : “불 함수를 사용하여 지연됩니다.” condition_fn` 는 `timeout_in_sec` 까지 ‘interval_in_sec’ 마다 호출됩니다. 조건을 충족하면 조기에 깨질 수 있습니다.Args: condition_fn – 호출 가능한 부울 함수 interval_in_sec – ‘condition_fn’ timeout_in_sec’을 호출하는 동안의 대기 시간 – 실행하기 위한 최대 시간을 반환합니다: なし “” start = last_call = time.time() while time.time () – start < timeout_in_sec:if (time.time () – last_call) > interval_in_sec:if condition_fn() が True:break last_call = time.time()def delay_until (condition_fn, interval_in_sec, timeout_in_sec) : “불 함수를 사용하여 지연됩니다.” condition_fn` 는 `timeout_in_sec` 까지 ‘interval_in_sec’ 마다 호출됩니다. 조건을 충족하면 조기에 깨질 수 있습니다.Args: condition_fn – 호출 가능한 부울 함수 interval_in_sec – ‘condition_fn’ timeout_in_sec’을 호출하는 동안의 대기 시간 – 실행하기 위한 최대 시간을 반환합니다: なし “” start = last_call = time.time() while time.time () – start < timeout_in_sec:if (time.time () – last_call) > interval_in_sec:if condition_fn() が True:break last_call = time.time()드리프트가 문제가 아닌 경우입니다import threading, timedef print_every_n_seconds(n=2):true:print(time.ctime()time을 지정합니다.sleep(n)thread=스렛디은그입니다.스레드(target=print_every_n_seconds, daemon=True)thread.start()입니다비동기로 출력합니다.#10월 16일 17:29:40 2018 #10월 16일 17:29:42 2018 #10월 16일 17:29:44실행 중인 작업에 상당한 시간이 걸리는 경우, 간격은 2초+작업 시간이기 때문에 정확한 스케줄이 필요한 경우에는 적합하지 않아요.daemon=True플래그는 이 스레드가 앱의 종료를 차단하지 않는 것을 의미합니다.예를 들어 이 광고가 중단되는 것을 기다리는 테스트를 실행한 뒤 pytest이 무기한 중단될 문제가 있었습니다.실행 중인 작업에 상당한 시간이 소요될 경우 간격은 2초 + 작업 시간이 되므로 정확한 일정이 필요한 경우에는 적합하지 않습니다.daemon=True 플래그는 이 스레드가 앱의 종료를 차단하지 않음을 의미합니다. 예를 들어, 이 광고가 중단되기를 기다리는 테스트를 수행한 후 pytest가 무기한 중단되는 문제가 있었습니다.대안적 유연성 솔루션은 APScheduler입니다.pip install aps 스케줄러pip install aps 스케줄러apscheduler.schedulers.background import BlockingSchedulerdef print_t():passched=BlockingScheduler()scheduler.add_job(print_t,’interval’, seconds=60)#는 60초마다 print_twork를 실행합니다.start()또 apscheduler는 다음과 같이 많은 스케줄을 제공합니다.Blocking Scheduler:스케쥬ー라이 프로세스에서 실행 중의 유일한 경우 사용 Background Scheduler:이하의 프레임워크를 사용하지 않고 애플리케이션 내부의 배경으로 스케줄을 실행하려는 경우에 사용합니다.AsyncIOScheduler:애플리케이션이 asyncio모듈을 사용할 경우 사용 GeventScheduler:애플리케이션이 gevent를 사용할 경우 사용 TornadoScheduler:Tornado애플리케이션을 빌드 할 경우 사용 TwistedScheduler:Twisted응용 프로그램을 빌드 할 경우 사용 QtScheduler:Qt응용 프로그램을 빌드 할 경우 사용또한 apscheduler는 다음과 같이 많은 스케줄러를 제공합니다.Blocking Scheduler: 스케줄러가 프로세스에서 실행 중인 유일한 경우, Background Scheduler: 아래의 프레임워크를 사용하지 않고 애플리케이션 내부의 백그라운드에서 스케줄러를 실행하고자 하는 경우에 사용합니다.AsyncIO Scheduler: 어플리케이션이 asyncio 모듈을 사용하는 경우, 사용 Gvent Scheduler: 어플리케이션이 gevent를 사용하는 경우, 사용 Tornado Scheduler: Tornado 어플리케이션을 빌드하는 경우, 사용 Twisted Scheduler: Twisted 어플리케이션을 빌드하는 경우, 사용 Qt Scheduler: Qt 어플리케이션을 빌드하는 경우, 사용단순히 사용import time while True:print(“이것은 30초마다 실행됩니다.””)#여기서 코드를 실행합니다.슬리프(30)import time while True:print(“이것은 30초마다 실행됩니다.””)#여기서 코드를 실행합니다.슬리프(30)import time while True:print(“이것은 30초마다 실행됩니다.””)#여기서 코드를 실행합니다.슬리프(30)나는 그것이 당신이 하고 싶기에 달렸다고 생각하고 당신의 질문에 많은 세부 사항이 지정되지 않았습니다.이미 복수의 쓰레드프로세스1개에서 비싼 작업을 실행하고 싶습니다.그래서 나는 그 지도자 프로세스가 시간을 확인하도록 하고 그녀만 비싼 작업(디프 러닝 모델의 확인)를 수행합니다.이렇게 하려면 카운터를 늘리고 5초, 10초, 15초가 경과하도록 하고, 5초마다 저장합니다(또는 math.floor와 함께 모듈식 산술을 사용).defprint_every_5_seconds_have_passed_exit_finally():””https://stackoverflow.com/questions/3393612/run-certain-code-every-n-seconds https://stackoverflow.com/questions/474528/what-is-the-best-way-to-repeatedly-execute-a-function-every-x-seconds:return:””opts=argparse를 선택합니다.이름 공간(start=time.time()next_time_to_print=0동안 True:current_time_passed=time.time()-opts.start:current_time_to_print+=5print(f’worked와{current__passed=})print(f'{current__termathfloor(curs)5passed%)==0)defprint_every_5_seconds_have_passed_exit_finally ():”” https://stackoverflow.com/questions/3393612/run-certain-code-every-n-seconds https://stackoverflow.com/questions/474528/what-is-the-best-way-to-repeatedly-execute-a-function-every-x-seconds :return:”” opts = argparse を選択します.이름공간 (start=time.time()) next_time_to_print = 0 の間、True: current_time_passed = time.time() – opts.start: current_time_to_print += 5print(f’worked と {current__passed =}) print(f’ {current__termathfloor(curs) 5passed %)== 0))__init__worked로__main__을 시작하고 current_time_passed=0.00017094612158203 current_time_passed%5=0.00017094612158203trueworked및 current_time_passed=5.0 current_time_passed%5=0.0입니다true worked및 current_time_passed=10.0 current_time_passed%5=0.0입니다true는 정상적으로 동작하고 current_time_passed=15.0 current_time_passed%5=0.0 True입니다나에게 필요한 것은 if문을 확인하는 것입니다.이미 복잡한 멀티 처리 다중 GPU코드에 스레드, 스케줄이 있다는 것은 피하고 가능하다면 추가하고자 하는 복잡함이 아닙니다.작업자 ID를 확인하는 것은 하나의 프로세스만이 이 작업을 수행하는지 확인하기가 용이합니다.참고로 정확한 시간을 확인하는 것은 확실하게 기능하지 않는 것이므로, 모듈식의 산술 트릭이 작동하는지 확인하기 위해서 True인쇄 글을 사용했습니다!그러나 놀랍게도 바닥이 속임수를 썼어요.나에게 필요한 것은 if문을 확인하는 것입니다. 이미 복잡한 멀티 처리 멀티 GPU 코드에 스레드, 스케줄러가 있다는 것은 피할 수 있으며 가능하면 추가하고 싶은 복잡성이 아닙니다. 작업자 ID를 확인하는 것은 하나의 프로세스만이 이 작업을 수행하는지 확인하는 것이 용이합니다.참고로 정확한 시간을 확인하는 것은 확실히 작동하지 않을 것이므로 모듈식 산술 트릭이 작동하는지 확인하기 위해 True 인쇄문을 사용했습니다! 하지만 놀랍게도 바닥이 속임수를 썼어요.다음과 같이 시스템 시계에 타임 루프를 잠급니다.import times starttime = time.time() while True:print(“tick”) time。sleep(60.0 – ((time.time() – starttime) % 60.0))import times starttime = time.time() while True:print(“tick”) time。sleep(60.0 – ((time.time() – starttime) % 60.0))import times starttime = time.time() while True:print(“tick”) time。sleep(60.0 – ((time.time() – starttime) % 60.0))저는 조금 전에 비슷한 문제에 직면했습니다. http://cronus.readthedocs.org 가 도움이 될까요?v0.2의 경우 다음 스니펫이 작동합니다.cronus 를 임포트 합니다.맹렬히 치다.set_rate(2) # 2 Hzwhile beat.true(): # 시간이 많이 걸리는 작업을 여기서 수행 beat.sleep () # 루프의 총 지속시간은 0.5초입니다cronus 를 임포트 합니다.맹렬히 치다.set_rate(2) # 2 Hzwhile beat.true(): # 시간이 많이 걸리는 작업을 여기서 수행 beat.sleep () # 루프의 총 지속시간은 0.5초입니다cronus 를 임포트 합니다.맹렬히 치다.set_rate(2) # 2 Hzwhile beat.true(): # 시간이 많이 걸리는 작업을 여기서 수행 beat.sleep () # 루프의 총 지속시간은 0.5초입니다내가 믿는 더 쉬운 방법은 다음과 같습니다.import timedef executeSomething(): #code here time。sleep(60)while True:executeSomething()이렇게 코드가 실행되고, 60초 동안 기다렸다가, 다시 실행되고, 기다렸다가 실행되는 등 복잡하게 생각할 필요는 없습니다 :D이렇게 코드가 실행되고, 60초 동안 기다린 후, 다시 실행되고, 기다렸다가 실행되는 등…. 복잡하게 생각할 필요는 없습니다 😀

