以下是这种情况:
我创建了一个打开并处理webdriver的子进程。子进程很挑剔并且可能出错,在这种情况下它会立即关闭,并且控制将返回到main函数。但是,在这种情况下,浏览器仍然会打开(因为子进程从未完全运行)。如何关闭在子进程中初始化的浏览器?
我到目前为止尝试过的方法:
1)在main函数中初始化webdriver并将其作为参数传递给子进程。
2)使用队列在子进程和父进程之间传递webdriver。
代码:
import multiprocessing
def foo(queue):
driver = webdriver.Chrome()
queue.put(driver)
# Do some other stuff
# If finicky stuff happens, this driver.close() will not run
driver.close()
if __name__ == '__main__':
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=foo, name='foo', args=(queue,))
# Wait for process to finish
# Try to close the browser if still open
try:
driver = queue.get()
driver.close()
except:
pass
答案 0 :(得分:0)
我找到了解决方案:
在foo()中,在打开新浏览器时获取webdriver的进程ID。将进程ID添加到队列中。然后在main函数中,添加time.sleep(60)等待一分钟,然后从队列中获取进程ID并使用try-except尝试关闭特定的进程ID。
如果在单独进程中运行的foo()挂起,则一分钟后将在main函数中关闭浏览器。