Python3 проблема с потоком

Возникла проблема с выполнением потока в классе:

class SourceCode:
    @staticmethod
    def _get_driver() -> webdriver:
        options = ChromeOptions()
        options.add_argument("--headless")
        return webdriver.Chrome(options=options)

    def __init__(self, kind=None):
        options = ChromeOptions()
        options.add_argument("--headless")
        self.driver = webdriver.Chrome(options=options)
        self.kinds = ['some','kinds','of','something']
        self.__counter = 1
        self.kind = kind
        self.total_count = 0
        Thread(target=self.get_total_count).start()

    def get_total_count(self):
        driver = self._get_driver()
        for kind in self.kinds:
            driver.get('XXX' + kind)
            soup = BeautifulSoup(driver.page_source, 'html.parser')
            _ = soup.find('span', {'class': 'something'}).text
            _ = sub('[А-Яа-я]+', '', _)
            self.total_count += int(_.strip())

При создании отдельного потока в конструкторе класса - происходят странные вещи. Я получаю не ти числа, которые обычно получал при синхронной работе. Причем они всегда разные. Если при синхронной работе я получаю 46000, то при работе метода в потоке я получаю то 38, то 12000 и.т.д.

Ощущение, что это какая-то базовая трабла с потоками, о которой я не знаю


Ответы (2 шт):

Автор решения: CrazyElf

А как вы вообще узнаёте, что поток завершился? Вы же это никак не проверяете и не можете проверить, поскольку запускаете поток "в свободное плавание". Вам нужно как-то убедиться, что поток завершился, иначе я подозреваю вы получаете промежуточный результат работы функции. Для этого нужно либо сохранить поток в переменную и сделать потом thread.join(), либо лучше использовать какую-то асинхронную библиотеку.

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

Ваш поток был скушан GC (сборщиком мусора) до его завершения. Это может произойти в любой момент после завершения функции __init__. От этого как-раз разные числа и получаются. Чтоб этого не произошло нужно присвоить его в переменную, которая будет доступна на время выполнения.

self.thread = Thread(target=self.get_total_count).start()

Перед тем как работать total_count можно дождаться выполнения треда через

self.thread.join()

без join у вас будет промежуточный результат, но он будет если тред успел завршиться.

→ Ссылка