Python на стероидах (Многопото́чность и его синхронизация)

FAYST

Участник
Статус
offline
Регистрация
18.03.2019
Сообщения
37
Репутация
23
Недавно сам открыл такую новость что в Pythone есть многопоточность хотя изучаю его уже 3 месяца, как не странно уроки по многопоточности в Python такие же убогие что почти сравниваются с API сервисными. Но так как я лучший гайдер то напишу свою статью по многопоточности.


Нам нужна библиотека threading, ну и все.

работает от таким образом:

import threading

Название_потока0 = threading.Thread(target =имя_функции, args = ('передаем_аргумент'))

(если аргумент не нужен то удаляем этот метод)

Название_потока0.start() # начинает процесс

Название_потока0.join() # дожидается окончания


потому как после .start() код пропускается (образно говоря как будто его нету в коде и процесс продолжается это нарушает весь порядок) поэтому нужно указывать "код должен продолжится когда этот поток выполниться" - и это выполняет .join()


Пример:

print
('Начало')

Название_потока0 =
threading.Thread(target =имя_функции0, args = ('0'))
Название_потока1 = threading.Thread(target =имя_функции1, args = ('1'))
Название_потока2 = threading.Thread(target =имя_функции2, args = ('2'))

Название_потока0.start()
Название_потока1.start()
Название_потока2.start()


Название_потока2.join()
Название_потока1.join()
Название_потока0.join()

print('Конец')


Именно в такой апозитной последовательности мы получим 3 потока которые (приблизительно) одинаково выполняться и в конце код продолжиться выполняться по порядку.

Ну вот и все

Особенности:

- Через return Не вытащить результат функции в потоке - для этого используем запись в текстовые блокноты для результатов, а потом открываем файлы в других функциях.

- Можно всем потоком обращаться к одной функции - как приведено в примере нижу я использую в обращаемых функциях (if проверяю_входящий_аргумент == 'ключ': ) для того чтобы дать разные ссылки браузерам.

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



Самый выгодный и наглядный пример с Seleniom:


# pip3 install selenium


import os
import time
import threading
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options





#___________________________ 3 _____________________________#
def https (ver):


if ver == "0":
a = 'https://www.avito.ru/sankt-peterburg?s_trg=3&q=авто'


elif ver == "1":
a = 'https://www.avito.ru/sankt-peterburg?s_trg=3&q=телефоны'

elif ver == "2":

a = 'https://www.avito.ru/sankt-peterburg?s_trg=3&q=кухни'


return a

#_________________________________________________________#




#__________________________ 2 ______________________________#
def op_0 (arg):

фаил0 = open('.\\d\\многопоток0.txt', mode = 'w',encoding='utf-8')

b=webdriver.Firefox()

b.get(https(arg))

a = b.find_element_by_class_name("item_table")
a1 = a.text
#print(a1)


try:
фаил0.write(a1)


finally:
фаил0.close()
b.close()
###########################################################
def op_1(arg):

фаил1 = open('.\\d\\многопоток1.txt', mode = 'w',encoding='utf-8')

b=webdriver.Firefox()
b.get(https(arg))


a =b.find_element_by_class_name("item_table")
a1 = a.text
#print(a1)

try:
фаил1.write(a1)


finally:
фаил1.close()
b.close()
###########################################################
def op_2(arg):

фаил2 = open('.\\d\\многопоток2.txt', mode = 'w',encoding='utf-8')


b=webdriver.Firefox()
b.get(https(arg))


a = b.find_element_by_class_name("item_table")
a1 = a.text
#print(a1)

try:
фаил2.write(a1)


finally:
фаил2.close()
b.close()
#_________________________________________________________#



#________________________ 1 _________________________________#
print('---- ON ----')

t0 = threading.Thread(target =op_0, args = ('0'))
t1 = threading.Thread(target =op_1, args = ('1'))
t2 = threading.Thread(target =op_2, args = ('2'))


t0.start()
t1.start()
t2.start()

t2.join()
t1.join()
t0.join()


print('----- END -----')
#____________________________________________________________#

м2.png

#____________________________________________________________#


m3.png

#____________________________________________________________#

м1.png
#____________________________________________________________#
 

uglyboy322

Местный
Статус
offline
Регистрация
13.01.2017
Сообщения
197
Репутация
74
извращенец. Для вытаскивания данных достаточно использовать глобальные списки\словари.