如何判断Python';s的多处理模块正在使用我的所有内核进行计算?

如何判断Python';s的多处理模块正在使用我的所有内核进行计算?,python,module,multiprocessing,porting,cpu-cores,Python,Module,Multiprocessing,Porting,Cpu Cores,我从以下教程中获得了一些简单的代码: 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

我从以下教程中获得了一些简单的代码:

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()
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...
我如何判断这是否利用了我的两个核心?目前我运行的是Ubuntu11.04 w/3 GB内存和英特尔Core 2 Duo@2.2GHz。

我学习这个的项目将被转移到某人办公室的一台巨大的机器上,它的马力比我现在拥有的要大得多。具体来说,处理器将至少有4个内核,我希望确保我的算法能够自动检测并利用所有可用的内核。此外,该系统可能不是Linux,因此在操作系统之间移动多处理模块时,是否有任何常见的失误需要注意 哦,是的,另外,脚本的输出看起来像这样:

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()
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都是相同的,因为上面的脚本在运行时是调用子进程的父进程,每个子进程都是不同的进程。那么,多处理是自动检测和处理多个核,还是我必须告诉它去哪里看?另外,从我在搜索这个问题的副本时所读到的内容来看,我不应该产生比核心更多的进程,因为它会占用原本用于计算的系统资源


提前感谢您的帮助,我的论文很喜欢您。

如果您在unix系统上,您可以尝试运行“top”命令并查看有多少进程同时显示。虽然这有点经验性,但很多时候只要查看流程列表就可以看到倍数

虽然查看了脚本,但我看不到您在哪里调用多个进程。您可以在导入multiprocessing.pool,然后将您的函数映射到不同的处理器。

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

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


陷阱(pratfalls?),可能是您的实际代码实际上并不需要多个进程,而是可以从线程中受益匪浅。此外,您必须非常小心如何在多处理中共享内存。与线程间通信相比,进程间通信需要更多的开销。因此,它通常只用于线程无法获得所需内容的情况。

下面是一个方便的小命令,我使用它从命令行监视内核:

watch -d "mpstat -P ALL 1 1 | head -n 12"
请注意,
mpstat
命令必须在您的系统上可用,您可以通过安装
sysstat
包在Ubuntu上获得该命令

sudo apt-get install sysstat

如果要从Python检测可用内核的数量,可以使用
multiprocessing.cpu\u count()
函数来检测。在具有超线程的英特尔CPU上,此数字将是实际内核数的两倍。启动尽可能多的进程,只要进程有足够的工作要做,并且不因通信而陷入困境,通常会扩展到完全占用机器上的所有内核。Linux的进程调度程序将从此处开始。

谢谢,这是代码的链接来源。但奇怪的是,在终端中运行“top”告诉我:Mem:~3GB总计,使用了~2.8GB。但当我统计所列进程使用的内存时,我只使用了大约20%的可用内存(我喜欢在任何时候都保持大约24个标签在FF@中运行)。top没有展示一些东西吗?我是否在某个地方有内存泄漏(我不认为在Python b/c自动垃圾收集中真的有这种可能)?此外,使用multiprocessing.map不会在不同的处理器上运行函数。它只在不同的进程中启动它们。FWIW,如果你在顶部点击“1”,它会在显示每个内核CPU总数的视图之间切换(YMMV,但我个人觉得看到8个内核以99%的CPU速度运行比默认视图显示693%的CPU使用率更令人满意)。哦,是的,系统监视器也告诉我我使用了大约35%的内存,但这与托普告诉我的还有很大差距。top是否只列出了当前正在访问的内存,而将存储在内存中的内容单独存储在内存中?太好了,非常感谢,希望我能上传评论(哦,等等,我可以!)。仍然希望得到一个关于核利用的答案。。。Python界普遍认为,由于GIL锁,多处理比线程更受欢迎(至少对于比OP代码更简单的“真实”东西)。(尽管在寻找证据和发现时,我发现这并不是那么简单!)@timday:我相信如果你的应用程序确实受到严重的CPU限制,多处理是首选,但正如你所发现的,它也因平台而异。另外,我个人的观点是,一些较新的python程序员希望正确使用多处理模块,因为它是一个流行词,从来没有真正尝试使用线程。在任何情况下,多处理都不是优于线程的首选方法。它只适用于。。。如果适用的话。哦,是的,锁在那里,因为我正在编辑代码,以查看锁定(原始示例所做的)和连接(我放在那里的)之间的区别。我可以看出我需要更多的工作(希望还有一些建议),但这就是为什么会有这样的理由。