Python에서 60 초마다 비동기 적으로 함수를 실행하는 방법은 무엇입니까?
파이썬에서 60 초마다 함수를 실행하고 싶지만 그동안 차단되고 싶지 않습니다.
어떻게 비동기 적으로 할 수 있습니까?
import threading
import time
def f():
print("hello world")
threading.Timer(3, f).start()
if __name__ == '__main__':
f()
time.sleep(20)
이 코드를 사용하면 20 초 time.time 내에 3 초마다 함수 f가 실행됩니다. 결국 오류가 발생하고 threading.timer가 취소되지 않았기 때문이라고 생각합니다.
어떻게 취소 할 수 있습니까?
미리 감사드립니다!
threading.Timer 클래스를 사용해 볼 수 있습니다 : http://docs.python.org/library/threading.html#timer-objects .
import threading
def f(f_stop):
# do something here ...
if not f_stop.is_set():
# call f() again in 60 seconds
threading.Timer(60, f, [f_stop]).start()
f_stop = threading.Event()
# start calling f now and every 60 sec thereafter
f(f_stop)
# stop the thread when needed
#f_stop.set()
나는 주변을 둘러보고 특정 이벤트 를 기다릴 수있는 Python 회로 프레임 워크를 발견했습니다
.
.callEvent(self, event, *channels)
회로 의 방법에는 화재 및 응답까지 중단 기능이 포함되어 있다고 문서에 나와 있습니다.
지정된 채널에 지정된 이벤트를 발생시키고 전달 될 때까지 실행을 중단합니다. 이 메서드는
yield
핸들러의 최상위 실행 수준 (예 : "yield self.callEvent(event)
") 에 대한 인수로만 호출 할 수 있습니다 . 이벤트가 전달 될 때까지 메인 루프에 의해 호출 될 생성기를 효과적으로 생성하고 반환합니다 (: func : 참조circuits.core.handlers.handler
).
나는 당신이 내가하는 것처럼 유용하다고 생각하기를 바랍니다 :)
./regards
그 동안 실제로 무엇을하고 싶은지에 따라 다릅니다. 스레드는 가장 일반적이고 가장 선호되지 않는 방법입니다. 스레딩을 사용할 때 문제를 알고 있어야합니다. 모든 (비 Python) 코드가 여러 스레드에서 동시에 액세스 할 수있는 것은 아닙니다. 스레드 간 통신은와 같은 스레드 안전 데이터 구조를 사용하여 수행해야합니다. Queue.Queue
인터럽트 할 수 없습니다. 외부에서 스레드를 제거하고 스레드가 여전히 실행중인 동안 프로그램을 종료하면 인터프리터가 중단되거나 가짜 역 추적이 발생할 수 있습니다.
종종 더 쉬운 방법이 있습니다. GUI 프로그램에서이 작업을 수행하는 경우 GUI 라이브러리의 타이머 또는 이벤트 기능을 사용하십시오. 모든 GUI에는이 기능이 있습니다. 마찬가지로 Twisted 또는 다른 서버 프로세스 모델과 같은 다른 이벤트 시스템을 사용하는 경우 주 이벤트 루프에 연결하여 함수를 정기적으로 호출 할 수 있어야합니다. 비 스레딩 접근 방식은 함수가 보류 중일 때 프로그램이 차단되지만 함수 호출 사이에는 차단되지 않습니다.
가장 간단한 방법은 60 초마다 무언가를 실행하는 백그라운드 스레드를 만드는 것입니다. 간단한 구현은 다음과 같습니다.
class BackgroundTimer(Thread):
def run(self):
while 1:
Time.sleep(60)
# do something
# ... SNIP ...
# Inside your main thread
# ... SNIP ...
timer = BackgroundTimer()
timer.start()
분명히, "무언가"에 오랜 시간이 걸리면 수면 설명에이를 수용해야합니다. 그러나 이것은 좋은 근사치 역할을합니다.
If you want to invoke the method "on the clock" (e.g. every hour on the hour), you can integrate the following idea with whichever threading mechanism you choose:
import time
def wait(n):
'''Wait until the next increment of n seconds'''
x = time.time()
time.sleep(n-(x%n))
print time.asctime()
I think the right way to run a thread repeatedly is the next:
import threading
import time
def f():
print("hello world") # your code here
myThread.run()
if __name__ == '__main__':
myThread = threading.Timer(3, f) # timer is set to 3 seconds
myThread.start()
time.sleep(10) # it can be loop or other time consuming code here
if myThread.is_alive():
myThread.cancel()
With this code, the function f is executed every 3 seconds within the 10 seconds time.sleep(10). At the end running of thread is canceled.
Why dont you create a dedicated thread, in which you put a simple sleeping loop:
#!/usr/bin/env python
import time
while True:
# Your code here
time.sleep(60)
'IT Share you' 카테고리의 다른 글
루비-고정 된 문자열을 수정할 수 없습니다 (TypeError). (0) | 2020.12.11 |
---|---|
PHP에서 사용되지 않는 set_magic_quotes_runtime을 어떻게 바꿀 수 있습니까? (0) | 2020.12.11 |
실제로 데이터베이스에없는 열을 SELECT에 포함 (0) | 2020.12.11 |
Scala를 위해 Eclipse에서 실행 구성 (0) | 2020.12.11 |
Custom ViewGroup 내에서 XML-Layout-File을 올바르게 팽창시키는 방법은 무엇입니까? (0) | 2020.12.11 |