Python programı sonsuza kadar nasıl çalıştırılır?


87

Python programımı sonsuz bir döngüde sonsuza kadar çalıştırmam gerekiyor ..

Şu anda bu şekilde çalıştırıyorum -

#!/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)

Bunu yapmanın daha iyi bir yolu var mı? Ya da time.sleeparamaya ihtiyacım var mı? Düşüncesi olan var mı?


Bunu yapmanın doğru yolu bu olacaktır. Satır time.sleep(5)altında girintili bir kodunuz olduğu sürece ihtiyacınız yok while True:( passen azından olabilir)
Holy Mackerel

1
İşlemi sonlandırmak yerine çıkmak istiyorsanız bir kırılma koşulu - "kapatma kancası" eklemek iyidir.
user3020494

7
Ancak uyumazsanız veya harici bir olay için uyuyan bir şey yapmazsanız (bir soketteki bağlantıları veya verileri dinlemek gibi) o zaman programınız% 100 CPU, yani busywait kullanır . Bu kibar değil :)
qris

Python 3.5 asyncio kullanabilir ve işlevleri olaylara bağlayabilir. GUI ile program, ui-olay döngüsünü yönetebilir (örneğin gtk.main ())
eri

Bu, bu sorunun bir kopyası gibi görünüyor: stackoverflow.com/questions/3226628/non-blocking-wait-in-python
dllahr

Yanıtlar:


104

Evet, while True:Python kodunu sürekli olarak çalıştırmak için asla kesintiye uğramayan bir döngü kullanabilirsiniz .

Ancak, sürekli olarak çalıştırmak istediğiniz kodu döngünün içine yerleştirmeniz gerekecektir :

#!/usr/bin/python

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

Ayrıca, bir komut dosyasının çalışmasını bir süre askıya almak için time.sleepkullanılır . Yani, sizinkinin sürekli çalışmasını istediğinize göre, onu neden kullanacağınızı anlamıyorum.


Bir .bat dosyası aracılığıyla python kodunu başlatırken True çalışmıyor gibi görünüyor
BarryMahnly

2
Mayıs time.sleepörnek 1ms bekleyen yerine onun maksimum hızda çalıştırarak performansını artırmak?
grobouDu06

37

Buna ne dersin?

import signal
signal.pause()

Bu, programınızın başka bir işlemden (veya başka bir iş parçacığında kendisinden) bir sinyal alana kadar uyumasına izin verir ve bir şeyler yapma zamanının geldiğini bildirir.


2
Sinyal iş parçacığını durduracak. Başlık, sonsuza kadar koşmakla ilgilidir. Sistem hizmeti veya arka plan programı gibi.
outoftime

1
bu sadece ana iş parçacığını durdurarak diğer iş parçacığının süresiz çalışmasına izin verir mi?
David V.

@David Evet, bu yalnızca ana iş parçacığını durdurur. Doğrulamak için test ettim.
Samuel

9

uyku, cpu'da aşırı yüklenmeyi önlemenin iyi bir yoludur

gerçekten zeki olup olmadığından emin değilim ama genellikle

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

uyku yöntemi her zaman Yok döndürür.


yorum yapmadan olumsuz oy mu verdiniz? Bu çözümü okuduğumda beğendim çünkü okunabilirliği / bakımı iyi. Bu kodun ilgilenen bir okuyucusunun döngü aralığını bulmak için kaydırmaya gitmesi gerekmez.
Matt

1
@mustafa hangisi? Kendinizi açıklayın, gayet iyi çalışıyor.
Porunga

1
ilk infazdan önce uyumuyor mu? Bunun genel olarak istenen bir davranış olduğunu düşünmüyorum
öğlen

7

Bunun çok eski bir konu olduğunu biliyorum ama neden kimse bundan bahsetmedi

#!/usr/bin/python3
import asyncio 

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

1
Programımı sonsuza kadar çalıştırmaya çalışırken her zaman bunu kullanırım. Neden kimsenin bundan bahsetmediğini bilmiyorum
madladzen

5

Destekleyen işletim sistemleri için select:

import select

# your code

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

5

İşte tam sözdizimi,

#!/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

Küçük bir interruptableloop.py betiğim var, kodu belirli aralıklarla (varsayılan 1sn) çalıştırıyor, çalışırken ekrana bir mesaj gönderiyor ve CTL-C ile gönderebileceğiniz bir kesme sinyalini yakalıyor:

#!/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

Komut dosyasını çalıştırıp sonra kestiğinizde şu çıktıyı görürsünüz (dönemler döngünün her geçişinde pompalanır):

[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

Müşteri kodundaki istisnaları KeyboardInterruptve SystemExitistisnaları yakalamak için özel bir sınıfa sahip olmak çok daha kolay (ve daha fazla Pythonic) olmaz mıydı?
Matthew Cole

Bunu kapsülleme için kullanıyorum ve okuma şeklini seviyorum. Açıkçası, interruptableloop uygulaması, onu kullanırken aklımdan geçmiyor.
Riaz Rizvi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.