Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 18212 / 648 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 11:

Многопоточные вычисления

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >

Класс Thread

Экземпляры класса threading.Thread представляют потоки Python-программы. Задать действия, которые будут выполняться в потоке, можно двумя способами: передать конструктору класса исполняемый объект и аргументы к нему или путем наследования получить новый класс с переопределенным методом run(). Первый способ был рассмотрен в примере выше. Конструктор класса threading.Thread имеет следующие аргументы:

Thread(group, target, name, args, kwargs)

Здесь group - группа потоков (пока что не используется, должен быть равен None ), target - объект, который будет вызван в методе run(), name - имя потока, args и kwargs - последовательность и словарь позиционных и именованных параметров (соответственно) для вызова заданного в параметре target объекта. В примере выше были использованы только позиционные параметры, но то же самое можно было выполнить и с применением именованных параметров:

import threading

            def proc(n):
              print "Процесс", n

            p1 = threading.Thread(target=proc, name="t1", kwargs={"n": "1"})
            p2 = threading.Thread(target=proc, name="t2", kwargs={"n": "2"})
            p1.start()
            p2.start()

То же самое можно проделать через наследование от класса threading.Thread с определением собственного конструктора и метода run():

import threading

            class T(threading.Thread):
              def __init__(self, n):
                threading.Thread.__init__(self, name="t" + n)
                self.n = n
              def run(self):
                print "Процесс", self.n

            p1 = T("1")
            p2 = T("2")
            p1.start()
            p2.start()

Самое первое, что необходимо сделать в конструкторе - вызвать конструктор базового класса. Как и раньше, для запуска потока нужно выполнить метод start() объекта-потока, что приведет к выполнению действий в методе run().

Жизнью потоков можно управлять вызовом методов:

  • start() Дает потоку жизнь.
  • run() Этот метод представляет действия, которые должны быть выполнены в потоке.
  • join([timeout]) Поток, который вызывает этот метод, приостанавливается, ожидая завершения потока, чей метод вызван. Параметр timeout (число с плавающей точкой) позволяет указать время ожидания (в секундах), по истечении которого приостановленный поток продолжает свою работу независимо от завершения потока, чей метод join был вызван. Вызывать join() некоторого потока можно много раз. Поток не может вызвать метод join() самого себя. Также нельзя ожидать завершения еще не запущенного потока. Слово "join" в переводе с английского означает "присоединить", то есть, поток, вызвавший join(), желает, чтобы поток по завершении присоединился к вызывающему метод потоку.
  • getName() Возвращает имя потока. Для главного потока это "MainThread".
  • setName(name) Присваивает потоку имя name.
  • isAlive() Возвращает истину, если поток работает (метод run() уже вызван, но еще не завершился).
  • isDaemon() Возвращает истину, если поток имеет признак демона. Программа на Python завершается по завершении всех потоков, не являющихся демонами. Главный поток демоном не является.
  • setDaemon(daemonic) Устанавливает признак daemonic того, что поток является демоном. Начальное значение этого признака заимствуется у потока, запустившего данный. Признак можно изменять только для потоков, которые еще не запущены.

В модуле Thread пока что не реализованы возможности, присущие потокам в Java (определение групп потоков, приостановка и прерывание потоков извне, приоритеты и некоторые другие вещи), однако они, скорее всего, будут созданы в недалеком будущем.

Таймер

Класс threading.Timer представляет действие, которое должно быть выполнено через заданное время. Этот класс является подклассом класса threading.Thread, поэтому запускается также методом start(). Следующий простой пример, печатающий на стандартном выводе Hello, world! поясняет сказанное:

def hello():
              print "Hello, world!"

            t = Timer(30.0, hello)
            t.start()
< Лекция 10 || Лекция 11: 12345 || Лекция 12 >
Денис Хохлов
Денис Хохлов

Будет ли адаптация лекций под Python 3?

Арсений Бердюгин
Арсений Бердюгин

скачал с оффсайта последнюю версию python под windows. запускаю примеры из лекции и оно ругается на синтаксис.

Синтаксис примеров в лекции не актуален?
 

Ольга Усенко
Ольга Усенко
Россия, г. Киров
Сергей Стройнов
Сергей Стройнов
Украина, Черновцы, Черновицкий Национальный Университет им.Ю.Федьковича, 1993