首页 > 解决方案 > Python Selenium 多线程不起作用

问题描述

我在 python 中使用硒。我想让程序多线程(4-10 个线程),但它不会工作。我不知道为什么。

当我开始时:输出:线程开始!

应该发生什么:输出:线程已启动!话题开始了!话题开始了!话题开始了!话题开始了!...

这是我尝试过的:

from selenium import webdriver
import string
import random
import time
from threading import Thread


def bot():
    while True:
        options = webdriver.ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-logging'])  # Disables logging
        options.add_argument('--disable-extensions')
        options.add_argument('--profile-directory=Default')
        options.add_argument("--incognito")
        options.add_argument("--disable-plugins-discovery");
        options.add_argument("--headless") # Turns Chrome into headless browser
        options.add_argument("--mute-audio")
        driver = webdriver.Chrome(options=options)
        driver.get("https://example.com/")
        driver.close()


def main():
    for _ in range(10):
        print("Thread started!")
        worker = Thread(target=bot())
        worker.setDaemon(True)
        worker.start()


if __name__ == '__main__':
    main()

标签: pythonmultithreadingselenium

解决方案


你有三个问题。首先,你说:

worker = Thread(target=bot())

它应该是:

worker = Thread(target=bot)

第二个问题是以下行:

worker.setDaemon(True)

你能说说你为什么这样做吗?守护线程是一个在所有非守护线程终止后将自动终止的线程。您有一个非守护线程,即在 function 中启动所有这些守护线程的主线程main()。一旦main返回,即在启动所有这些 dameon 线程之后立即终止!因此,所有守护线程都以它终止。这就是你需要的:

def main():
    threads = [Thread(target=bot) for _ in range(10)]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join() # wait for this thread to terminate

第三个问题在于功能bot

driver.close()

应该:

driver.quit()

不仅要关闭窗口,还要终止进程并允许线程终止。


推荐阅读