首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >affinity.get_process_affinity_mask(pid)返回ValueError 22

affinity.get_process_affinity_mask(pid)返回ValueError 22
EN

Stack Overflow用户
提问于 2014-07-01 18:50:14
回答 1查看 442关注 0票数 0

我想把我的线程工作放在某个特定的CPU上(我想测试GIL对我的程序的影响……),然后我找到了一个名为affinity的第三方库。我在我的虚拟机(Linux)中使用了pip安装亲和力,不幸的是,我得到了以下错误:

代码语言:javascript
复制
>>>pid = os.getpid()
>>>affinity.get_process_affinity_mask(pid)
Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: (22, 'Invalid argument')

从代码洞察来看,它应该在Linux平台上工作:

代码语言:javascript
复制
...
elif sys.platform in ('linux2'):
from _affinity import set_process_affinity_mask, get_process_affinity_mask
...

有人能给我一些关于这个错误的线索吗?或者,在我的案例中,有没有其他方法可以使用?

EN

回答 1

Stack Overflow用户

发布于 2014-07-01 20:05:40

查看C代码和sched_getaffinity的手册页,我并不太惊讶它可能会因为“无效参数”而失败。C代码传入一个无符号长整型,其中函数需要一个cpu_set_t,最多可以有128个无符号长整型。

我对cpu_set_t结构了解不多,但从表面上看,它可能是每个物理CPU一个值,各个核心表示为其中一个值中的位。在这种情况下,我认为这个模块在任何有多个CPU的机器上都会失败。

我的系统是单CPU双核系统,所以这个模块适合我。您的虚拟机是否配置了多个物理CPU?作为测试,尝试将其重新配置为只有一个内核和多个内核,看看您是否更成功。

如果我是对的,解决这个问题的唯一方法是修改C模块以正确处理cpu_set_t结果,可能是使用CPU_SET (3)中描述的宏。

您的虚拟机环境是什么?虚拟机软件、CPU/核心计数、Linux版本?试一下这个测试程序,看看你的输出有没有什么不同:

代码语言:javascript
复制
$ cat test.c 
#include <stdio.h>
// The CPU_SET man page says to use the second definition, but my system
// wouldn't compile this code without the first one.
#define __USE_GNU
#define _GNU_SOURCE
#include <sched.h>
#include <errno.h>

int main(void) {
    cpu_set_t cur_mask;
    unsigned int len = sizeof(cpu_set_t);

    if (sched_getaffinity(0, len, &cur_mask) < 0) {
        printf("Error: %d\n", errno);
        return errno;
    }

    int cpu_count = CPU_COUNT(&cur_mask);
    printf("Cpu count: %d and size needed: %d\n", cpu_count, CPU_ALLOC_SIZE(cpu_count));
    return 0;
}
$ gcc -std=c99 test.c 
$ ./a.out 
Cpu count: 2 and size needed: 8

在我的系统上,似乎一个无符号的long足以容纳64个CPU,所以它看起来比我想象的要简单得多。但是,不同的硬件/架构/内核版本总是不同的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24508422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档