在类中执行线程时出现问题:
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
等等。
感觉这是流的某种基本问题,我不知道
您的线程在完成之前被 GC(垃圾收集器)吃掉了。这可以在函数结束后的任何时间发生
__init__
。这就是不同的数字是如何产生的。为防止这种情况发生,您需要将其分配给在运行时可用的变量。在运行total_count之前,可以通过等待线程执行
没有加入你将有一个中间结果,但如果线程有时间结束的话。
你怎么知道一个线程已经结束?您不以任何方式检查它,也无法检查它,因为您开始“自由游泳”的流程。您需要以某种方式确保线程已结束,否则我怀疑您正在获得该函数的中间结果。为此,您需要将流保存到一个变量并稍后再做
thread.join()
,或者最好使用某种异步库。