Домой

Последняя активность

  

Процессы и потоки в Python

PyDeKolt avatar PyDeKolt (0) [#] (27.05.2013 / 18:24)
Запущенная на Python программа называется процессом. Процесс при запуске содержит один единственный поток, который обычно называют главным потоком процесса. Поток последовательно выполняет инструкции программного кода.

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

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

Для обмена информацией между процессами нужно использовать механизмы взаимодействия процессов IPC (Inter-Process Communication). Одним из таких механизмов является — обмен сообщениями. Сообщение — это простой буфер двоичных байтов передаваемых через каналы ввода-вывода, по средством операций send() и recv().

Также существует и другие механизмы, например отображаемые области памяти (модуль mmap). Этот метод основан на использовании разделяемых областей памяти, доступных всем процессам.


Вместо запуска новых процессов, можно создать новые потоки в текущем процессе. Такие потоки будут выполнять собственные последовательности инструкций, иметь свой стек вызова функций, а также иметь доступ к данным и системным ресурсам выделяемым процессу.

Создавать новые потоки целесообразно, когда необходимо реализовать одновременное выполнение нескольких задач и имеется значительный объем данных, которые должны быть доступны всем потокам.

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

В Python существует глобальная блокировка интерпретатора Global Interpreter Lock (GIL). Из-за доступа к переменным интерпретатора, GIL вынуждена блокировать потоки и фактически одновременно будет выполняться только один поток. Лишь при блокирующих операциях, таких как ввод-вывод у других потоков есть шанс перехватить эстафету на выполнение.

Многопоточность лучше всего использовать при написании логики с множеством операции ввода-вывода. Программный код с многочисленными вычислениями не имеет смысл переносить на многопоточность, это плачевно скажется на производительности программы. Большой объем вычислений в программном коде лучше всего реализовать в несколько процессов, обеспечив их взаимодействие с помощью механизма обмена сообщений.
  1. import time
  2. import multiprocessing
  3. class EmailMessage(multiprocessing.Process):
  4. def __init__(self, email, msg):
  5. super(EmailMessage, self).__init__()
  6. self.email = email
  7. self.msg = msg
  8. def run(self):
  9. self.send_msg()
  10. time.sleep(5)
  11. def send_msg(self):
  12. print "Send message from %s" % self.email
  13. emails = ['bobby@gmail.com', 'mikki@gmail.com', 'frank@gmail.com']
  14. for email in emails:
  15. p = EmailMessage(email, 'Hello world!')
  16. p.start()

- Многопоточность в Python
* Онлайн учебник для Python
  Всего: 1

Зарегистрируйтесь и сможете комментировать все темы. Кнопочка вверху
Фильтр по автору
Скачать тему

В Форум

Новые вверху
Statok.net Рейтинг@Mail.ru
spywap.nettop-sid.ru
Яндекс.Метрика