5

我有一些来自这样的教程的简单代码:

from multiprocessing import Process, Lock
import os

def f(i):
    print 'hello world', i
    print 'parent process:', os.getppid()
    print 'process id:', os.getpid(), "\n\n"

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        p = Process(target=f, args=(num,))
        p.start()
    p.join()

我如何判断这是否同时使用了我的两个内核?目前我正在运行 Ubuntu 11.04 w/3 GB RAM 和 Intel Core 2 Duo @ 2.2GHz。

我正在为此学习的项目将被转移到某人办公室的一台巨大机器上,其马力比我目前拥有的要多得多。具体来说,处理器至少有 4 个内核,我想确保让我的算法自动检测和利用所有可用的内核。此外,该系统可能不是 Linux,所以在操作系统之间移动多处理模块时是否有任何常见的错误需要注意?

哦,是的,脚本的输出看起来像这样:

hello world 0
parent process: 29362
process id: 29363 


hello world 1
parent process: 29362
process id: 29364 


hello world 2
parent process: 29362
process id: 29365 

and so on...

因此,据我所知,PPID 都是相同的,因为上面的脚本在运行时是调用子进程的父进程,每个子进程都是不同的进程。那么多处理是否会自动检测和处理多个内核,还是我必须告诉它在哪里查找?此外,根据我在搜索这个问题的副本时所读到的内容,我不应该产生比核心更多的进程,因为它会占用原本用于计算的系统资源。

提前感谢您的帮助,我的论文爱您。

4

3 回答 3

3

这是我用来从命令行监视我的核心的一个方便的小命令:

watch -d "mpstat -P ALL 1 1 | head -n 12"

请注意,该mpstat命令必须在您的系统上可用,您可以通过安装sysstat软件包在 Ubuntu 上获得该命令。

sudo apt-get install sysstat

如果您想从 Python 中检测可用内核的数量,您可以使用该multiprocessing.cpu_count()函数来实现。在具有超线程的 Intel CPU 上,这个数字将是实际内核数的两倍。只要进程有足够的工作要做并且不会因通信而陷入困境,启动与可用内核一样多的进程通常会扩展以完全占用计算机上的所有内核。Linux 的进程调度程序将从那里获取它。

于 2012-04-05T23:33:55.190 回答
1

关于您的代码示例的一些事情。即使您创建了一个,您当前也没有使用您的锁。而且,您只是加入了您开始的最后一个过程。现在它们可能结束得很快,以至于您不会看到任何问题,但是如果任何早期的过程比上一个过程花费的时间更长,我认为您可能会在它们完成之前终止。

关于确保每个过程最终都在不同的核心上。不幸的是你不能。这是操作系统的调度程序将做出的决定。您只是在编写使用多个进程的代码,以允许系统并行调度它们。有些可能在同一个核心上。

陷阱(pratfalls?),可能是您的实际代码实际上并不需要多个进程,而是可以从线程中获得更好的收益。此外,您必须非常小心在多处理中共享内存的方式。与进程间通信相比,进程间通信涉及更多开销。因此,它通常保留用于线程根本无法满足您的需求的情况。

于 2012-04-05T23:29:06.203 回答
0

如果您使用的是 unix 系统,您可以尝试运行“top”命令并查看有多少进程同时显示。虽然它有点经验,但很多时候只看进程列表就会让你看到倍数。

尽管查看了您的脚本,但我看不到您在哪里调用多个进程。您可以导入 multiprocessing.pool,然后将您的函数映射到不同的处理器。
http://docs.python.org/library/multiprocessing.html

于 2012-04-05T23:18:18.150 回答