Python multiprocessing как паралельно обратиться к запущенным объектам класса

Требуется запустить тестирование сайта в несколько паралельных потоков. Нужно прогнать несколько тестов записанных как методы класса. Логика такая:

  1. Запустить 3 сессии хрома.
  2. Прогнть тест n в 3 потока. На основе объеденённых данных, выдать задание для теста 2.
  3. Повторить п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 шт):

Автор решения: vadim vaduxa
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 может или еще что. Она не умеет работать многопоточно, для распараллеливания можно использовать докеры.

→ Ссылка
Автор решения: NETkuz

Всё получилось достаточно просто.

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])`
→ Ссылка