我有一个 shell 脚本,它循环遍历包含我想要访问并截取屏幕截图的 URL 的文本文件。
这一切都完成了,而且很简单。脚本初始化一个类,该类在运行时会创建列表中每个站点的屏幕截图。有些站点需要很长时间才能加载,有些站点可能根本无法加载。所以我想将屏幕抓取函数包装在一个超时脚本中,False如果函数无法在 10 秒内完成,则让它返回。
False
我对最简单的解决方案感到满意,也许设置一个异步计时器,无论函数内部实际发生什么,它都会在 10 秒后返回 False?
要在 Python 中实现一个简单的超时机制,你可以使用 subprocess 模块启动一个带有超时的子进程,并在特定时间后终止它。这种方法适用于你的情况,其中你想要执行某些操作,例如访问网站并捕获屏幕截图,但希望在超时发生时能够立即返回 False。
subprocess
timeout
python import subprocess import threading
python class TimeoutException(Exception): pass
python def execute_with_timeout(command, timeout): """ Execute a command with a timeout """ proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) timer = threading.Timer(timeout, proc.kill) try: timer.start() stdout, stderr = proc.communicate() return stdout.decode('utf-8'), stderr.decode('utf-8'), proc.returncode finally: timer.cancel()
假设你有一个函数 take_screenshot(url),它负责访问给定 URL 并截取屏幕截图。你可以使用上面定义的 execute_with_timeout 函数来调用它,并设置超时时间。
take_screenshot(url)
execute_with_timeout
```python def take_screenshot(url): # 实现截图逻辑,返回 True 或 False pass
url = "http://example.com“ command = [“python3”, “screenshot_script.py”, url] # 替换成实际的截图脚本和参数 timeout_seconds = 10
try: stdout, stderr, returncode = execute_with_timeout(command, timeout_seconds) if returncode == 0: print(“Screenshot taken successfully”) else: print(“Screenshot failed”) except TimeoutException: print(“Screenshot timed out after {} seconds”.format(timeout_seconds)) ```
command
subprocess.Popen
threading.Timer
proc.kill()
proc.communicate()
返回获取到的标准输出、标准错误、和返回码。
take_screenshot 函数:
take_screenshot
这是你实现的截图逻辑,可以根据实际情况编写。
示例用法:
timeout_seconds
这种方法允许你在超时发生时终止正在执行的任务(如访问网站和截图),并及时返回 False,而不会阻塞程序。