Я должен использовать ветвление или потоки?

В моем сценарии у меня есть функциональное нечто, которое в основном использует pynotify для уведомления пользователя о чем-то неоднократно после того, как временной интервал говорит 15 минут.

def foo:
    while True:
        """Does something"""
        time.sleep(900)

Мой основной сценарий должен взаимодействовать с пользователем и делает все другие вещи так я просто вызов наклона нечто () функция. непосредственно.

Каков лучший способ сделать его и почему? Используя ветвление или потоки?

8
задан BalusC 23 October 2011 в 15:20
поделиться

5 ответов

Я не скажу вам, какой из них использовать, но вот некоторые преимущества каждого из них:

Потоки могут запускаться быстрее чем процессы, а потоки используют меньше ресурсов операционной системы, чем процессы, включая память, дескрипторы файлов и т.д. .

Каждый процесс имеет свою собственную отдельную память и переменные, что означает, что процессы обычно обмениваются данными, отправляя сообщения друг другу. Это гораздо легче сделать правильно , чем связать потоки через разделяемую память. Процессы также могут выполняться по-настоящему одновременно, так что, если у вас несколько ядер ЦП, вы можете держать их все занятыми, используя процессы. В Python * глобальная блокировка интерпретатора не позволяет потокам широко использовать более одного ядра.


* - То есть CPython, реализация Python, которую вы получите, если зайдете на http://python.org и загрузите Python. Другие реализации Python (например, Jython ) не обязательно запрещают Python запускать потоки на нескольких процессорах одновременно. Спасибо @EOL за разъяснения.

9
ответ дан 5 December 2019 в 07:58
поделиться

Использование нескольких процессов позволяет использовать несколько ядер ЦП одновременно, в то время как в CPython использование потоков не работает (потоки по очереди используют одно ядро ​​ЦП) - так что, если у вас интенсивная работа с ЦП и вы абсолютно хотите чтобы использовать потоки, вам следует рассмотреть Jython или IronPython; с CPython этого соображения часто бывает достаточно, чтобы склонить к выбору модуль multiprocessing и отказ от модуля threading (они предлагают довольно похожие интерфейсы, потому что многопроцессорность была спроектирован так, чтобы его можно было легко установить вместо нарезания резьбы ).

За исключением этого важного соображения, потоки часто могут быть лучшим выбором (с точки зрения производительности) в Windows (где создание нового процесса - сложная задача), но реже в вариантах Unix (Linux, версии BSD, OpenSolaris, MacOSX , ...), поскольку создание нового процесса там быстрее (но если вы используете IronPython или Jython, вы должны проверить на платформах, которые вам интересны, что это все еще применяется к рассматриваемым виртуальным машинам - CLR с либо .NET, либо Mono для IronPython, ваша JVM для Jython).

4
ответ дан 5 December 2019 в 07:58
поделиться

Если под форком вы имеете в виду os.fork, то я бы не стал его использовать. Это не кроссплатформенность и слишком низкий уровень - вам нужно будет самостоятельно реализовать взаимодействие между процессами.

Если вы хотите использовать отдельный процесс, используйте либо модуль подпроцесса, либо, если вы используете Python 2.6 или новее, новый модуль multiprocessing . У него очень похожий API на модуль потоковой передачи, поэтому вы можете начать использовать потоки, а затем легко переключиться на процессы или наоборот.

Для того, что вы хотите сделать, я бы использовал потоки, если только "" "не делает что-то" "" не требует интенсивного использования ЦП и вы хотите использовать преимущества нескольких ядер, в чем я сомневаюсь в данном конкретном случае. кейс.

1
ответ дан 5 December 2019 в 07:58
поделиться

Для такого рода проблем ни потоки, ни вилочные процессы не кажутся правильным подходом. Если все, что вы хотите сделать, это раз в 15 минут уведомлять пользователя о чем-то, почему бы не использовать цикл событий, как реактор GLib или Twisted? Это позволит вам запланировать операции, которые должны выполняться раз в некоторое время, и заняться остальной частью вашей программы.

4
ответ дан 5 December 2019 в 07:58
поделиться

Процессы намного проще. Просто отпустите их и позвольте ОС справиться с этим.

Кроме того, процессы часто намного более эффективны. Процессы не имеют общего пула ресурсов ввода-вывода; они полностью независимы.

Python subprocess.Popen обрабатывает все.

3
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: