为什么os.nice(10)在OS X上会失败?
为什么在 OS X 上使用 os.nice(10)
会出现 OSError: [Errno 1] Operation not permitted
的错误呢?这个是在普通用户账户下运行的:
$ python
…
>>> os.nice(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 1] Operation not permitted
具体信息:
- Python 版本:2.7.2
- 操作系统版本:OS X 10.8.4
2 个回答
1
检查一下你的 PRIO_MAX 值是什么,以及普通用户可以使用哪些优先级。
除了超级用户以外的用户只能改变自己拥有的进程的优先级,并且只能在 0 到 PRIO_MAX(20)之间逐渐增加他们的“nice 值”。
https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/renice.8.html
4
正如Lukas Graf所指出的,os.nice
是用来增加优先级的,而不是直接设置它。
这似乎是一个OS X的错误,当你在优先级为20或更高时调用nice
就会触发这个问题:
nice -n 20 python -c 'import os; os.nice(10)'
这个会失败,而
nice -n 19 python -c 'import os; os.nice(10)'
这个则可以正常工作。一个简单的C程序也会遇到同样的问题:
#include <unistd.h>
#include <string.h>
int main() {
if(nice(10) < 0)
perror("nice");
}
如果你用nice -n 20 ./test
来运行它,会打印出错误,但如果用nice -n 19 ./test
来运行,就能成功。
原因是优先级20超出了nice
API支持的最大优先级(NZERO
)。OS X的nice
工具使用setpriority
,所以它会忽略这个限制,但nice
的C函数(Python直接使用的)是会考虑这个限制的。如果进程的优先级是20或更高,nice
会试图把优先级设置为19,但这是不被允许的(因为这会提高进程的优先级,而只有特权用户才能这样做)。
这是一个奇怪的错误,但只要不使用优先级20,就能轻松避免。