更改变量名会影响代码行为
Changing a variable name affects the code behavior
当我运行这段代码时,selenium之一windows没有关闭
import multiprocessing
from selenium import webdriver
class Worker:
def __init__(self):
self.driver = webdriver.Chrome()
def run(self):
self.driver.get('https://www.google.com')
processes = []
for i in range(2):
worker = Worker()
process = multiprocessing.Process(target=worker.run)
process.start()
processes.append(process)
for any_name in processes:
any_name.terminate()
但是如果我将变量名从 any_name
更改为 worker
,那么所有 selenium windows 都会关闭。为什么会这样?
PS 版本:python 3.7,chromedriver 83,selenium 3.141.0
这是因为浏览器关闭行为依赖于selenium.webdriver.common.service.Service
的__del__
方法使浏览器Windows退出,而__del__
只有在出现时才会被调用不再引用您的 WebDriver
个实例。下面是 Service.__del__
:
的实现
def __del__(self):
# `subprocess.Popen` doesn't send signal on `__del__`;
# so we attempt to close the launched process when `__del__`
# is triggered.
try:
self.stop()
except Exception:
pass
stop()
方法关闭一切。
现在,变量命名很重要的原因是它会影响程序退出时是否有任何对 WebDriver
的引用。当您的第一个 for 循环完成时,worker
仍在范围内,它包含对您创建的第二个 Worker
的引用,它包含对 WebDriver
的引用。当您的主程序完成时,它会保持在范围内,这意味着 __del__
永远不会被调用,并且浏览器 window 不会关闭。
但是,当您在第二个 for 循环中重新使用 worker
时,这意味着不再保留对第二个 Worker
的引用,这意味着没有对 [=14] 的引用=] 在内存中,这意味着 __del__
将被调用并且 window 将关闭。您可以通过在第一个 for 循环之外显式添加 worker = None
来确认此行为。有了这个改变,两个浏览器 windows 总是退出,不管你在第二个循环中使用什么变量名。
当我运行这段代码时,selenium之一windows没有关闭
import multiprocessing
from selenium import webdriver
class Worker:
def __init__(self):
self.driver = webdriver.Chrome()
def run(self):
self.driver.get('https://www.google.com')
processes = []
for i in range(2):
worker = Worker()
process = multiprocessing.Process(target=worker.run)
process.start()
processes.append(process)
for any_name in processes:
any_name.terminate()
但是如果我将变量名从 any_name
更改为 worker
,那么所有 selenium windows 都会关闭。为什么会这样?
PS 版本:python 3.7,chromedriver 83,selenium 3.141.0
这是因为浏览器关闭行为依赖于selenium.webdriver.common.service.Service
的__del__
方法使浏览器Windows退出,而__del__
只有在出现时才会被调用不再引用您的 WebDriver
个实例。下面是 Service.__del__
:
def __del__(self):
# `subprocess.Popen` doesn't send signal on `__del__`;
# so we attempt to close the launched process when `__del__`
# is triggered.
try:
self.stop()
except Exception:
pass
stop()
方法关闭一切。
现在,变量命名很重要的原因是它会影响程序退出时是否有任何对 WebDriver
的引用。当您的第一个 for 循环完成时,worker
仍在范围内,它包含对您创建的第二个 Worker
的引用,它包含对 WebDriver
的引用。当您的主程序完成时,它会保持在范围内,这意味着 __del__
永远不会被调用,并且浏览器 window 不会关闭。
但是,当您在第二个 for 循环中重新使用 worker
时,这意味着不再保留对第二个 Worker
的引用,这意味着没有对 [=14] 的引用=] 在内存中,这意味着 __del__
将被调用并且 window 将关闭。您可以通过在第一个 for 循环之外显式添加 worker = None
来确认此行为。有了这个改变,两个浏览器 windows 总是退出,不管你在第二个循环中使用什么变量名。