파이썬 프로그램을 영원히 실행하는 방법은 무엇입니까?


87

파이썬 프로그램을 무한 루프에서 영원히 실행해야합니다 ..

현재 나는 이것을 다음과 같이 실행하고 있습니다-

#!/usr/bin/python

import time

# some python code that I want 
# to keep on running


# Is this the right way to run the python program forever?
# And do I even need this time.sleep call?
while True:
    time.sleep(5)

더 나은 방법이 있습니까? 아니면 time.sleep전화 가 필요한 가요? 이견있는 사람?


그게 올바른 방법입니다. 줄 time.sleep(5)아래에 일부 코드를 들여 쓰기 만하면는 필요하지 않습니다 while True:( pass최소한 만있을 수 있음 )
Holy Mackerel 2013

1
중단 조건을 추가하는 것이 좋습니다. 프로세스를 종료하는 대신 종료하려는 경우 "shutdown hook"입니다.
user3020494 2013

7
그러나 잠을 자지 않거나 외부 이벤트 (예 : 연결 또는 소켓의 데이터 수신)를 위해 잠자는 작업을 수행하면 프로그램은 100 % CPU, 일명 busywait를 사용 합니다. 예의 바른 것이 아닙니다. :)
qris

Python 3.5는 asyncio를 사용하고 함수를 이벤트에 바인딩 할 수 있습니다. GUI를 사용한 프로그램은 ui-event 루프를 처리 할 수 ​​있습니다 (예 : gtk.main ())
eri

이것은이 질문의 중복 인 것 같습니다 : stackoverflow.com/questions/3226628/non-blocking-wait-in-python
dllahr

답변:


104

예, while True:중단되지 않는 루프를 사용하여 Python 코드를 계속 실행할 수 있습니다 .

그러나 계속 실행하려는 코드를 루프 안에 넣어야합니다 .

#!/usr/bin/python

while True:
    # some python code that I want 
    # to keep on running

또한 일정 기간 동안 스크립트 작업 time.sleep일시 중지 하는 데 사용됩니다 . 그래서, 당신은 당신의 것이 계속 실행되기를 원하기 때문에 당신이 그것을 사용하는 이유를 모르겠습니다.


.bat 파일을 통해 파이썬 코드를 시작할 때 True가 작동하지 않는 것 같지만
BarryMahnly

2
수 있습니다 time.sleep예를 들어,이 1ms를 기다리는 대신 자사의 최대 속도로 실행하여 성능을 향상?
grobouDu06

36

이건 어때?

import signal
signal.pause()

이렇게하면 프로그램이 다른 프로세스 (또는 다른 스레드에서)로부터 신호를받을 때까지 잠자기 상태가되어 무언가를 할 시간임을 알립니다.


2
신호는 스레드를 중지합니다. 제목은 영원히 달리는 것입니다. 시스템 서비스 또는 데몬과 같습니다.
outoftime

1
그러면 주 스레드 만 중지되어 다른 스레드가 무기한 실행될 수 있습니까?
David V.

@David 예, 이것은 메인 스레드 만 중지합니다. 확인을 위해 방금 테스트했습니다.
Samuel

9

수면은 CPU의 과부하를 피하는 좋은 방법입니다.

정말 영리한지는 모르겠지만 저는 보통

while(not sleep(5)):
    #code to execute

sleep 메서드는 항상 None을 반환합니다.


댓글없이 비추천? 이 솔루션은 가독성 / 유지 보수성이 우수하기 때문에 읽을 때 마음에 들었습니다. 이 코드에 관심이있는 독자는 루프 간격을 찾기 위해 스크롤 할 필요가 없습니다.
Matt

1
@mustafa 어느 것? 자신을 설명하면 완벽하게 잘 작동합니다.
Porunga

1
첫 실행 전에 잠을 자지 않습니까? 나는 그것이 일반적으로 바람직한 행동이라고 생각하지 않는다
noonex

7

나는 이것이 너무 오래된 스레드라는 것을 알고 있지만 아무도 이것을 언급하지 않은 이유

#!/usr/bin/python3
import asyncio 

loop = asyncio.get_event_loop()
try:
    loop.run_forever()
finally:
    loop.close()

1
내 프로그램을 영원히 실행하려고 할 때 항상 이것을 사용합니다. 왜 아무도 이것을 언급하지 않았는지 모르겠습니다
madladzen

5

지원하는 OS의 경우 select:

import select

# your code

select.select([], [], [])

5

다음은 완전한 구문입니다.

#!/usr/bin/python3

import time 

def your_function():
    print("Hello, World")

while True:
    your_function()
    time.sleep(10) #make function to sleep for 10 seconds

1

일정한 간격 (기본값 1 초)으로 코드를 실행 하는 작은 스크립트 interruptableloop.py 가 있으며 실행중인 동안 화면에 메시지를 펌핑하고 CTL-C로 보낼 수있는 인터럽트 신호를 트랩합니다.

#!/usr/bin/python3
from interruptableLoop import InterruptableLoop

loop=InterruptableLoop(intervalSecs=1) # redundant argument
while loop.ShouldContinue():
   # some python code that I want 
   # to keep on running
   pass

스크립트를 실행 한 다음 중단하면 다음 출력이 표시됩니다 (루프의 모든 패스에서주기가 펌핑 됨).

[py36]$ ./interruptexample.py
CTL-C to stop   (or $kill -s SIGINT pid)
......^C
Exiting at  2018-07-28 14:58:40.359331

interruptableLoop.py :

"""
    Use to create a permanent loop that can be stopped ...

    ... from same terminal where process was started and is running in foreground: 
        CTL-C

    ... from same user account but through a different terminal 
        $ kill -2 <pid> 
        or $ kill -s SIGINT <pid>

"""
import signal
import time
from datetime import datetime as dtt
__all__=["InterruptableLoop",]
class InterruptableLoop:
    def __init__(self,intervalSecs=1,printStatus=True):
        self.intervalSecs=intervalSecs
        self.shouldContinue=True
        self.printStatus=printStatus
        self.interrupted=False
        if self.printStatus:
            print ("CTL-C to stop\t(or $kill -s SIGINT pid)")
        signal.signal(signal.SIGINT, self._StopRunning)
        signal.signal(signal.SIGQUIT, self._Abort)
        signal.signal(signal.SIGTERM, self._Abort)

    def _StopRunning(self, signal, frame):
        self.shouldContinue = False

    def _Abort(self, signal, frame):
        raise 

    def ShouldContinue(self):
        time.sleep(self.intervalSecs)
        if self.shouldContinue and self.printStatus: 
            print( ".",end="",flush=True)
        elif not self.shouldContinue and self.printStatus:
            print ("Exiting at ",dtt.now())
        return self.shouldContinue

전용 클래스를 사용하는 것보다 클라이언트 코드에서 KeyboardInterruptSystemExit예외를 포착하는 것이 훨씬 더 쉽고 (그리고 더 Pythonic) 더 쉬울 까요?
Matthew Cole

나는 이것을 캡슐화에 사용하고 읽는 방식을 좋아합니다. 분명히 interruptableloop 의 구현은 내가 그것을 사용할 때 내 마음을 통해 실행되지 않습니다.
Riaz Rizvi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.