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 -----')
#____________________________________________________________#
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 -----')
#____________________________________________________________#
#____________________________________________________________#
#____________________________________________________________#