Làm thế nào để chạy chương trình Python mãi mãi?


83

Tôi cần chạy chương trình Python của mình mãi mãi trong một vòng lặp vô hạn ..

Hiện tại tôi đang chạy nó như thế này -

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

Có cách nào tốt hơn để làm điều đó không? Hay tôi thậm chí cần time.sleepgọi? Có suy nghĩ gì không?


Đó sẽ là cách đúng đắn để làm điều đó. Bạn không cần time.sleep(5), miễn là bạn đã một số mã thụt vào bên dưới while True:dòng (nó chỉ có thể passở mức tối thiểu)
Holy Mackerel

1
Sẽ rất tốt nếu bạn thêm một điều kiện ngắt - "shutdown hook", nếu bạn muốn thoát, thay vì giết quá trình.
user3020494

7
Nhưng nếu bạn không ngủ hoặc làm điều gì đó ngủ cho một sự kiện bên ngoài (như lắng nghe kết nối hoặc dữ liệu trên ổ cắm) thì chương trình của bạn sẽ sử dụng 100% CPU, hay còn gọi là busywait . Điều này là không lịch sự :)
qris

Python 3.5 có thể sử dụng asyncio và liên kết các hàm với các sự kiện. Chương trình với GUI có thể đối phó với vòng lặp ui-event (ví dụ: gtk.main ())
eri

Điều này có vẻ giống như một bản sao của câu hỏi này: stackoverflow.com/questions/3226628/non-blocking-wait-in-python
dllahr

Câu trả lời:


99

Có, bạn có thể sử dụng một while True:vòng lặp không bao giờ ngắt để chạy mã Python liên tục.

Tuy nhiên, bạn sẽ cần đặt mã bạn muốn chạy liên tục bên trong vòng lặp:

#!/usr/bin/python

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

Ngoài ra, time.sleepđược sử dụng để tạm dừng hoạt động của một tập lệnh trong một khoảng thời gian. Vì vậy, vì bạn muốn của bạn chạy liên tục, tôi không hiểu tại sao bạn lại sử dụng nó.


trong khi True dường như không hoạt động khi khởi chạy mã python qua tệp .bat
BarryMahnly

1
Có thể time.sleepcải thiện hiệu suất bằng cách chờ ví dụ 1ms thay vì chạy ở tốc độ tối đa không?
538ROMEO

34

Còn cái này thì sao?

import signal
signal.pause()

Điều này sẽ cho phép chương trình của bạn ngủ cho đến khi nó nhận được tín hiệu từ một số tiến trình khác (hoặc chính nó, trong một luồng khác), cho nó biết đã đến lúc phải làm điều gì đó.


2
Tín hiệu sẽ dừng luồng. Tiêu đề là về việc chạy mãi mãi. Giống như dịch vụ hệ thống hoặc daemon.
outtime

1
điều đó sẽ chỉ dừng lại luồng chính, cho phép các luồng khác chạy vô thời hạn?
David V.

@David Có, điều này chỉ dừng lại chủ đề chính. Tôi chỉ thử nghiệm để xác nhận.
Samuel

9

ngủ là một cách tốt để tránh quá tải trên cpu

không chắc nó có thực sự thông minh hay không, nhưng tôi thường sử dụng

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

phương thức ngủ luôn trả về Không có.


phản đối không có bình luận? Tôi thích giải pháp này khi tôi đọc nó, vì nó có khả năng đọc / bảo trì tốt. Người đọc quan tâm đến mã này không cần phải cuộn để tìm khoảng thời gian lặp.
Matt

1
@mustafa cái nào? giải thích cho mình, nó hoạt động hoàn toàn tốt.
Porunga

1
nó không ngủ trước khi thực hiện lần đầu tiên? Tôi không nghĩ đó là hành vi mong muốn nói chung
noonex

5

cho hệ điều hành hỗ trợ select:

import select

# your code

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

5

Đây là cú pháp hoàn chỉnh,

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

5

Tôi biết đây là chủ đề quá cũ nhưng tại sao không ai đề cập đến điều này

#!/usr/bin/python3
import asyncio 

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

1
Tôi luôn sử dụng điều này khi cố gắng làm cho chương trình của tôi chạy mãi mãi. Tôi không biết tại sao không ai đề cập đến điều này
madladzen

1

Tôi có một tập lệnh nhỏ ngắtableloop.py chạy mã ở một khoảng thời gian (mặc định 1 giây), nó đưa ra một thông báo tới màn hình trong khi nó đang chạy và bẫy một tín hiệu ngắt mà bạn có thể gửi bằng 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

Khi bạn chạy tập lệnh và sau đó ngắt nó, bạn sẽ thấy đầu ra này, (các khoảng thời gian xuất hiện trên mỗi lần vượt qua của vòng lặp):

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

ruptableLoop.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

Sẽ không dễ dàng hơn rất nhiều (và nhiều Pythonic) nếu chỉ bắt các ngoại lệ KeyboardInterruptSystemExitngoại lệ trong mã máy khách, thay vì có một lớp dành riêng cho nó?
Matthew Cole

Tôi sử dụng nó để đóng gói và tôi thích cách nó đọc. Rõ ràng là việc triển khai thực hiện ngắtableloop không chạy qua tâm trí tôi khi tôi đang sử dụng nó.
Riaz Rizvi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.