Python 01_multi_new

Содержание

Слайд 2

Str.decode(encoding = 'UTF-8',errors = 'strict’)
encoding – это кодирование, которое будут использоваться.
errors – здесь могут

Str.decode(encoding = 'UTF-8',errors = 'strict’) encoding – это кодирование, которое будут использоваться.
быть даны установки других схем обработки ошибок. Значение по умолчанию для ошибок «strict», это означает, что ошибки кодирования поднимают UnicodeError. Другие возможные значения: ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ и любое другое имя, зарегистрированное через codecs.register_error().

Слайд 3

Потоки Thread

Потоки Thread

Слайд 5

bs_str=BS(html.text, 'html.parser')
bs_str=BS(html,'lxml')

bs_str=BS(html.text, 'html.parser') bs_str=BS(html,'lxml')

Слайд 6

Логгирование

Логгирование

Слайд 9

Использование наследования

Использование наследования

Слайд 13

Использование Lock()

lock.acquire()
try:
... доступ к разделяемому ресурсу
finally:
lock.release() # освободить блокировку, что

Использование Lock() lock.acquire() try: ... доступ к разделяемому ресурсу finally: lock.release() #
бы ни произошло

Слайд 15

lock = Lock()
lock.acquire() # заблокирует выполнение, если блокировка кем-то захвачена
... доступ к

lock = Lock() lock.acquire() # заблокирует выполнение, если блокировка кем-то захвачена ...
разделяемому ресурсу
lock.release()

Слайд 17

with lock:
... доступ к разделяемому ресурсу

with lock: ... доступ к разделяемому ресурсу

Слайд 20

lock.acquire(False)

if not lock.acquire(False):
... не удалось заблокировать ресурс
else:
try:
... доступ к

lock.acquire(False) if not lock.acquire(False): ... не удалось заблокировать ресурс else: try: ...
разделяемому ресурсу
finally:
lock.release()

 acquire может принимать флаг False, если установить флаг в False, метод не блокируется, но вернёт False, если блокировка кем-то захвачена

Слайд 21

lock.locked()

if not lock.locked():
# другой поток может начать выполняться перед тем как

lock.locked() if not lock.locked(): # другой поток может начать выполняться перед тем
мы перейдём к следующему оператору
lock.acquire() # всё равно может заблокировать выполнение

Слайд 22

Проблемы Lock()

import threading
lock = threading.Lock()
def get_first_part():
lock.acquire()
try:
# берем данные для

Проблемы Lock() import threading lock = threading.Lock() def get_first_part(): lock.acquire() try: #
первой части из общих ресурсах.
finally:
lock.release()
return data
def get_second_part():
lock.acquire()
try:
# берем данные для второй части из общих ресурсах.
finally:
lock.release()
return data

def get_both_parts():
first = get_first_part()
second = get_second_part()
return first, second

Слайд 23

Возможное решение

def get_both_parts():
lock.acquire()
try:
first = get_first_part()
second = get_second_part()
finally:

Возможное решение def get_both_parts(): lock.acquire() try: first = get_first_part() second = get_second_part()
lock.release()
return first, second

Слайд 24

Решение с RLock()

import threading
lock = threading.RLock()
def get_first_part():
lock.acquire()
try:
# берем данные

Решение с RLock() import threading lock = threading.RLock() def get_first_part(): lock.acquire() try:
для первой части из общих ресурсах.
finally:
lock.release()
return data
def get_second_part():
lock.acquire()
try:
# берем данные для второй части из общих ресурсах.
finally:
lock.release()
return data

Слайд 25

RLock()

lock = threading.Lock()
lock.acquire()
lock.acquire() # вызов заблокирует выполнение
lock = threading.RLock()
lock.acquire()
lock.acquire() # вызов не

RLock() lock = threading.Lock() lock.acquire() lock.acquire() # вызов заблокирует выполнение lock =
заблокирует выполнение

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

Слайд 26

BoundedSemaphore()

semaphore = threading.BoundedSemaphore()
semaphore.acquire() # уменьшает счетчик
... доступ к общему ресурсу
semaphore.release() # увеличивает

BoundedSemaphore() semaphore = threading.BoundedSemaphore() semaphore.acquire() # уменьшает счетчик ... доступ к общему
счетчик

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

Слайд 27

max_connections = 10
semaphore = threading.BoundedSemaphore(max_connections)

max_connections = 10 semaphore = threading.BoundedSemaphore(max_connections)

Слайд 28

Event()

event = threading.Event()
# поток клиента может подождать пока флажок будет установлен
event.wait()
# серверный

Event() event = threading.Event() # поток клиента может подождать пока флажок будет
поток может установить или сбросить флажок
event.set()
event.clear()

Слайд 29

Condition()
lock = threading.RLock()
condition_1 = threading.Condition(lock)
condition_2 = threading.Condition(lock)

Condition() lock = threading.RLock() condition_1 = threading.Condition(lock) condition_2 = threading.Condition(lock)

Слайд 30

# Поток производителя
... генерация товара
condition.acquire()
... добавление товара в ресурс
condition.notify() # отправляем уведомление

# Поток производителя ... генерация товара condition.acquire() ... добавление товара в ресурс
о новом товаре
condition.release()

# Поток потребителя
condition.acquire()
while True:
... получаем товар из ресурсов
if item:
break
condition.wait() # в противном случае ожидаем поступление товара
condition.release()
... обработка товара

Слайд 31

subprocess и Timer

subprocess и Timer

Слайд 32

Загрузка файлов

Загрузка файлов

Слайд 33

Использование очередей

Использование очередей

Слайд 34

Модуль multiprocessing

Модуль multiprocessing

Слайд 41

Работа с очередями

Работа с очередями
Имя файла: Python-01_multi_new.pptx
Количество просмотров: 33
Количество скачиваний: 0