Должен ли я использовать вилку или темы? - PullRequest
8 голосов
/ 20 марта 2010

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 20 марта 2010

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

Потоки могут запускаться быстрее, чем процессы, и потоки используют меньше ресурсов операционной системы, чем процессы, включая память, файловые дескрипторы и т. Д. Потоки также дают вам возможность общаться через общие переменные (хотя многие скажем, это скорее недостаток, чем преимущество - см. ниже).

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


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

4 голосов
/ 20 марта 2010

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

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

4 голосов
/ 20 марта 2010

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

3 голосов
/ 20 марта 2010

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

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

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

1 голос
/ 20 марта 2010

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

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

Для того, что вы хотите сделать, я думаю, что я бы использовал потоки, если """does something""" не потребляет много ресурсов процессора и вы не хотите использовать преимущества нескольких ядер, что я сомневаюсь в этом конкретном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...