问题
你想对在 Unix 系统上面运行的程序设置内存或 CPU 的使用限制。
解决方案
resource 模块能同时执行这两个任务。例如,要限制 CPU 时间,可以像下面这样做:
import resource
import os
def time_exceeded(signo, frame):
print("Time's up!")
raise SystemExit(1)
def set_max_runtime(seconds):
# Install the signal handler and set a resource limit
soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
signal.signal(signal.SIGXCPU, time_exceeded)
if __name__ == '__main__':
set_max_runtime(15)
while True:
pass
程序运行时,SIGXCPU 信号在时间过期时被生成,然后执行清理并退出。
要限制内存使用,设置可使用的总内存值即可,如下:
def limit_memory(maxsize):
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))
像这样设置了内存限制后,程序运行到没有多余内存时会抛出 MemoryError 异常。
讨论
在本节例子中,setrlimit() 函数被用来设置特定资源上面的软限制和硬限制。软限制是一个值,当超过这个值的时候操作系统通常会发送一个信号来限制或通知该进程。硬限制是用来指定软限制能设定的最大值。通常来讲,这个由系统管理员通过设置系统级参数来决定。尽管硬限制可以改小一点,但是最好不要使用用户进程去修改。
setrlimit() 函数还能被用来设置子进程数量、打开文件数以及类似系统资源的限制。更多详情请参考 resource 模块的文档。
需要注意的是本节内容只能适用于 Unix 系统,并且不保证所有系统都能如期工作。比如我们在测试的时候,它能在 Linux 上面正常运行,但是在 OS X 上却不能。
启动一个 WEB 浏览器
问题
你想通过脚本启动浏览器并打开指定的 URL 网页
解决方案
webbrowser 模块能被用来启动一个浏览器,并且与平台无关。例如:
>>> webbrowser.open('http://www.python.org')
True
>>>
它会使用默认浏览器打开指定网页。如果你还想对网页打开方式做更多控制,还可以使用下面这些函数:
>>> webbrowser.open_new('http://www.python.org')
True
>>>
>>> # Open the page in a new browser tab
>>> webbrowser.open_new_tab('http://www.python.org')
True
>>>
这样就可以打开一个新的浏览器窗口或者标签,只要浏览器支持就行。
如果你想指定浏览器类型,可以使用 webbrowser.get() 函数来指定某个特定浏览器。例如:
>>> c.open('http://www.python.org')
True
>>> c.open_new_tab('http://docs.python.org')
True
>>>
讨论
在脚本中打开浏览器有时候会很有用。例如,某个脚本执行某个服务器发布任务,你想快速打开一个浏览器来确保它已经正常运行了。或者是某个程序以 HTML 网页格式输出数据,你想打开浏览器查看结果。不管是上面哪种情况,使用 webbrowser 模块都是一个简单实用的解决方案。