Многопоточность

Модуль multiprocessing: Минимальная документация по многопоточности

ДИСКЛЕЙМЕР! ДАННОЕ ОПИСАНИЕ НЕ ПРЕТЕНДУЕТ НА ПОЛНОТУ!

Данный модуль является близким аналогом модуля threading. Большинство объявлений описанных здесь совпадают с объявлениями threading.

Объявления

Не описанные в разделе объявления можно посмотреть в официальной документации.

Process Определяет отдельный поток. После создания и настройки объекта его требуется запустить.
Queue Очередь, используемая для обмена данными между потоками. Использует внутри себя Pipe.
Pipe (connection) Канал связи, который очень напоминает сокеты.
Value Общая для всех потоков переменная.
Array Общий для всех потоков массив.

Класс Process

Конструктор

Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

Конструктор должен всегда вызываться с указанием параметров по ключевым словам. Всегда group=None.

target это функция, которая принимает указанные в args и kwargs аргументы. Этот код будет исполнен параллельно.

name это строка, обеспечивающая идентификацию процесса.

daemon булевая переменная, указывающая является ли процесс самостоятельным или вспомогательным для текущего. Смерть текущего процесса убивает все вспомогательные.

Также поток может быть создан с помощью наследования от этого класса, тогда потомок должен вызывать у родительского класса __init__() в конструкторе и переопределить метод run.

Методы

run() Данный метод вызывается, если определён, при вызове метода start. Именно этот метод содержит код, который должен быть выполнен параллельно.
start() Данный метод начинает исполнение потока.
bool = is_alive() Возвращает True, если поток исполняется.
terminate() Моментально и окончательно убивает процесс. Очень опасный метод. Повреждает заблокированные мьютексы и коннекторы. Может быть вызвано только процессом создавшим убиваемый процесс.
close() Освобождает все ресурсы, выделенные под процесс. Должен быть вызван ПОСЛЕ остановки процесса.

Список атрибутов

pid Возвращает ID процесса.
exitcode Код, выброшенный при остановке процесса.

Queue, Pipe, connection

Данные классы предназначены для связи между потоками.

Queue

Класс Queue существует для передачи последовательности сообщений от одного потока другому. Существуют не рассматриваемые здесь разновидности SimpleQueue и JoinableQueue. Оба класса очень похожи на обычную Queue. Относительно Queue из библиотеки queue есть одно очень важное отличие: все методы выдают приблизительное значение, т.к. нет гарантии что это значение не будет изменено другим потоком.

Конструктор

Queue([maxsize])

Конструктор указывает максимальный размер очереди. В случае чтения пустой очереди и переполнения выбрасывается queue.Empty или queue.Full из стандартной библиотеки.

Методы

size = qsize() Текущий размер очереди.
bool = empty() Пустая ли очередь.
bool = full() Заполнена ли очередь.
put(obj[, block[, timeout]]) Кладёт объект к очередь, если очередь переполнена выбрасывает queue.Full. Если указан block = True, то в случае переполнения ждёт освобождения места в течении timeout или вечно.
obj = get([block[, timeout]]) Извлекает последний элемент из очереди и ждёт его появления в течении timeout, если block = True. Если элементов нет или время ожидания превышено выбрасывает исключение queue.Empty.
close() Закрывает внутренний поток взаимодействия

Pipe & Connection

Функция conn1, conn2 = Pipe([duplex]) возвращает 2 конца "трубы", один из которых должен быть передан другому потоку. Оба конца являются экземплярами класса Connection. Если вызвать функцию Pipe с duplex = False, conn1 не сможет отправлять сообщения, а conn2 их принимать.

Методы. (Connection)

send(obj) Отправляет объект, объект должен быть не слишком большим, а также сериализуемым с помощью pickle.
obj = recv() Ожидает входящих данных. Если ожидание прервано методом close(), выбрасывает EOFError
descr = fileno() Возвращает файловый дескриптор
close() Разрушает соединение.
obj = send_bytes(buffer[, offset[, size]]) Отправляет bytearray, начиная с указанной позиции, отправляя указанное число байт.
input = recv_bytes([maxlength])) Ожидает входящий массив байт, размером не более maxlength. Если ожидание прервано методом close(), выбрасывает EOFError
recv_bytes_into(buffer[, offset]) Ожидает входящий массив байт, записывает его в buffer начиная с позиции offset. Если ожидание прервано методом close(), выбрасывает EOFError

Синхронизация

Для обмена данными между потоками можно использовать блокировки и разделённую память. Блокировки являются стандартными семафорами. Все они поддерживают методы acquire(block=True, timeout=None) для блокировки и release() для разблокировки. Оставляю ссылки на них.

Lock Стандартный нерекурсивный мьютекс.
RLock Стандартный рекурсивный мьютекс.
Semaphore Стандартный семафор.

Value

Конструктор Value(typecode_or_type, *args, lock=True). Возвращает ctypes объект, расположенный в разделённой памяти. typecode_or_type описывает тип данных, *args - аргументы конструктора для указанного типа.

lock - автоматическая ли синхронизация (содержит ли свой рекурсивный мьютекс). Если указано значение False, то вы сами должны заботиться об синхронизации.

Array

Конструктор Array(typecode_or_type, size_or_initializer, *, lock=True). Возвращает массив ctypes объектов, расположенный в разделённой памяти. size_or_initializer Это размер массива или список элементов, которые должны быть в него записаны.

lock - автоматическая ли синхронизация (содержит ли свой рекурсивный мьютекс). Если указано значение False, то вы сами должны заботится об синхронизации.