Python multiprocessing как паралельно обратиться к запущенным объектам класса
Требуется запустить тестирование сайта в несколько паралельных потоков. Нужно прогнать несколько тестов записанных как методы класса. Логика такая:
- Запустить 3 сессии хрома.
- Прогнть тест n в 3 потока. На основе объеденённых данных, выдать задание для теста 2.
- Повторить п2 N раз.
Запускать 3 сессии хрома я научился, а как дальше к ним паралельно одновременно обращаться не могу догадаться. Просьба подсказать.
from multiprocessing.pool import ThreadPool as Pool
# Тут пошла отсебятина для общего понимания логики
from my_parsing_functions import example
from my_browser import Chrome
class multi_parsing:
def __init__(self, id_browser):
self.id_browser = id_browser
self.work_chrome = Chrome().start_chrome(self.id_browser)
def anything(self, blabla=None):
something=example(self.work_chrome.get(blabla))
#Отсебятина закончилась. Дальше главное
threads=3
pool = Pool(threads)
working_chrome_sessions = pool.map(multi_parsing, range(threads)) # Тут я получаю список 3 запущенных сессий хрома.
# Дальше хочу обращаться к ним с разными методами типа такого
for session in working_chrome_sessions:
session.anything()
# Логично, обращение к запущенным сессиям происходит по очереди. Вопрос, как сделать одновременно(т.е. паралельно)
Ответы (2 шт):
class multi_parsing:
def __init__(self, id_browser):
self.id_browser = id_browser
self.work_chrome = Chrome().start_chrome(self.id_browser)
def anything(self, blabla=None):
return example(self.work_chrome.get(blabla))
def test2(self, blabla):
return example(self.work_chrome.get(blabla))
threads = 3
working_chrome_sessions = list(map(multi_parsing, range(threads)))
with Pool(processes=threads) as p: # Прогнть тест n в 3 потока.
ares = [p.apply_async(ob.anything, kwds=dict(blabla=None)) for ob in working_chrome_sessions]
res = [a.get() for a in ares]
if all(res): # На основе объеденённых данных,
blabla = sum(res) # выдать задание для теста 2.
with Pool(processes=threads) as p: # Повторить п2 N раз.
ares = [p.apply_async(ob.test2, kwds=dict(blabla=blabla)) for ob in working_chrome_sessions]
res = [a.get() for a in ares]
Но у вас все равно ничего не выйдет, поскольку для браузера вы используете какую то видимо основанную на Selenium библиотеку my_browser, Helium может или еще что. Она не умеет работать многопоточно, для распараллеливания можно использовать докеры.
Всё получилось достаточно просто.
working_chrome_sessions хранит в себе запущенные сеансы хрома. Нужно было к ним обратиться через map и lambda.
Сделал примерно так:
from multiprocessing.pool import ThreadPool as Pool
# Тут пошла отсебятина для общего понимания логики
from my_parsing_functions import example
from my_browser import Chrome
class multi_parsing:
def __init__(self, id_browser):
self.id_browser = id_browser
self.work_chrome = Chrome().start_chrome(self.id_browser)
def anything(self, blabla=None):
something=example(self.work_chrome.get(blabla))
#Отсебятина закончилась. Дальше главное
threads=3
pool = Pool(threads)
working_chrome_sessions = pool.map(multi_parsing, range(threads))
#РЕШЕНИЕ!
link = [link_0,link_1,link_2]
def function_example(chrome_session, link):
chrome_session.get(link)
return chrome_session.page_sourse
pool_func = pool(threads)
working_func = pool.map(function_example, lambda x:chrome_session[x], link[x])`