Muszę uruchamiać program w języku Python w nieskończonej pętli.
Obecnie prowadzę to w ten sposób -
#!/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)
Czy jest lepszy sposób na zrobienie tego? A może nawet muszę time.sleep
zadzwonić? jakieś pomysły?
python
infinite-loop
Alan W. Smith
źródło
źródło
time.sleep(5)
, o ile masz jakiś kod wcięty poniżejwhile True:
linii (może to byćpass
minimum)Odpowiedzi:
Tak, możesz użyć
while True:
pętli, która nigdy się nie zrywa, aby stale uruchamiać kod Pythona.Będziesz jednak musiał umieścić kod, który chcesz stale uruchamiać, wewnątrz pętli:
#!/usr/bin/python while True: # some python code that I want # to keep on running
Ponadto,
time.sleep
stosuje się zawiesić działanie skryptu na pewien okres czasu. Tak więc, skoro chcesz, aby Twój działał nieprzerwanie, nie rozumiem, dlaczego miałbyś go używać.źródło
time.sleep
poprawić wydajność, czekając na przykład 1 ms zamiast pracować z maksymalną prędkością?A co z tym?
import signal signal.pause()
Pozwoli to programowi spać, dopóki nie otrzyma sygnału z innego procesu (lub samego siebie, w innym wątku), informując go, że nadszedł czas, aby coś zrobić.
źródło
spanie to dobry sposób na uniknięcie przeciążenia procesora
Nie jestem pewien, czy to naprawdę sprytne, ale zwykle używam
while(not sleep(5)): #code to execute
metoda uśpienia zawsze zwraca wartość None.
źródło
Wiem, że to zbyt stary wątek, ale dlaczego nikt o tym nie wspomniał
#!/usr/bin/python3 import asyncio loop = asyncio.get_event_loop() try: loop.run_forever() finally: loop.close()
źródło
dla systemów operacyjnych, które obsługują
select
:import select # your code select.select([], [], [])
źródło
Oto pełna składnia,
#!/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
źródło
Mam mały skrypt interruptableloop.py, który uruchamia kod w odstępach czasu (domyślnie 1 sekunda), wypompowuje wiadomość na ekran podczas działania i przechwytuje sygnał przerwania, który możesz wysłać za pomocą 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
Po uruchomieniu skryptu, a następnie przerwaniu go, zobaczysz następujące dane wyjściowe (okresy wypompowują się przy każdym przejściu pętli):
[py36]$ ./interruptexample.py CTL-C to stop (or $kill -s SIGINT pid) ......^C Exiting at 2018-07-28 14:58:40.359331
przerywalnaLoop.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
źródło
KeyboardInterrupt
iSystemExit
w kodzie klienta, zamiast mieć dla niego dedykowaną klasę?