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


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

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

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