Python: Pass или Sleep для длительных процессов? - PullRequest
34 голосов
/ 09 февраля 2009

Я пишу приложение обработки очереди, которое использует потоки для ожидания и ответа на сообщения очереди, которые должны быть доставлены в приложение. Для основной части приложения оно просто должно оставаться активным. Для примера кода, например:

while True:
  pass

или

while True:
  time.sleep(1)

Какой из них окажет наименьшее влияние на систему? Каков предпочтительный способ ничего не делать, но поддерживать работу приложения на Python?

Ответы [ 7 ]

59 голосов
/ 09 февраля 2009

Я бы предположил, что time.sleep () будет иметь меньше нагрузки на систему. Использование pass заставит цикл немедленно переоценить и привязать ЦП, тогда как использование time.sleep позволит временно приостановить выполнение.

РЕДАКТИРОВАТЬ : просто чтобы доказать свою точку зрения, если вы запустите интерпретатор python и запустите это:

>>> while True:
...     pass
... 

Вы можете наблюдать, как Python мгновенно начинает загружать процессор на 90-100%, по сравнению с:

>>> import time 
>>> while True:
...     time.sleep(1)
... 

который почти не регистрируется на мониторе активности (здесь используется OS X, но он должен быть одинаковым для каждой платформы).

24 голосов
/ 09 февраля 2009

Зачем спать? Вы не хотите спать, вы хотите дождаться окончания потоков.

Так

# store the threads you start in a your_threads list, then
for a_thread in your_threads:
    a_thread.join()

См .: thread.join

9 голосов
/ 06 февраля 2018

Если вы ищете короткий, с нулевым процессором способ зацикливания навсегда до KeyboardInterrupt, вы можете использовать:

from threading import Event

Event().wait()

Примечание: из-за ошибка , это работает только на Python 3.2+. Кроме того, похоже, что он не работает в Windows. По этой причине while True: sleep(1) может быть лучшим вариантом.

Для некоторого фона Event объекты обычно используются для ожидания завершения долго выполняющихся процессов:

def do_task():
    sleep(10)
    print('Task complete.')
    event.set()

event = Event()
Thread(do_task).start()
event.wait()

print('Continuing...')

Какие отпечатки:

Task complete.
Continuing...
6 голосов
/ 09 февраля 2009

Вы не даете большого контекста тому, что вы действительно делаете, но, возможно, Queue можно было бы использовать вместо явного цикла занятости-ожидания? Если нет, я бы предположил, что sleep будет предпочтительнее, так как я считаю, что он будет потреблять меньше ресурсов процессора (как уже отмечали другие).

[Отредактировано в соответствии с дополнительной информацией в комментарии ниже.]

Может быть, это очевидно, но в любом случае, то, что вы могли бы сделать в случае, когда вы читаете информацию из блокирующих сокетов, - это прочитать один поток из сокета и отправить сообщения с соответствующим форматированием в Queue и затем прочитайте остальные ваши «рабочие» потоки из этой очереди; рабочие будут блокировать чтение из очереди без необходимости ни pass, ни sleep.

4 голосов
/ 09 февраля 2009

Я всегда видел / слышал, что использование сна - лучший способ сделать это. Использование sleep не позволит использовать процессор вашего Python-интерпретатора диким образом.

2 голосов
/ 11 декабря 2018

signal.pause() - другое решение, см. https://docs.python.org/3/library/signal.html#signal.pause

Заставить процесс спать до получения сигнала; будет вызван соответствующий обработчик. Ничего не возвращает Не в Windows. (См. Сигнал справочной страницы Unix (2).)

0 голосов
/ 17 ноября 2017

Запуск метода в качестве фонового потока со сном в Python

    import threading
    import time


    class ThreadingExample(object):
        """ Threading example class
        The run() method will be started and it will run in the background
        until the application exits.
        """

        def __init__(self, interval=1):
            """ Constructor
            :type interval: int
            :param interval: Check interval, in seconds
            """
            self.interval = interval

            thread = threading.Thread(target=self.run, args=())
            thread.daemon = True                            # Daemonize thread
            thread.start()                                  # Start the execution

        def run(self):
            """ Method that runs forever """
            while True:
                # Do something
                print('Doing something imporant in the background')

                time.sleep(self.interval)

    example = ThreadingExample()
    time.sleep(3)
    print('Checkpoint')
    time.sleep(2)
    print('Bye')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...