我从这样的教程中得到了一些简单的代码:
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都是一样的,因为上面运行的脚本是调用子进程的父进程,每个进程都是一个不同的进程。那么多处理自动检测和处理多个核心,或者我必须告诉它在哪里看?另外,根据我在搜索此问题的副本时所阅读的内容,我不应该产生比核心更多的进程,因为它会占用原本用于计算的系统资源。
先谢谢你的帮助,我的论文很爱你。
答案 0 :(得分: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的进程调度程序将从那里开始。
答案 1 :(得分:1)
关于代码示例的一些事项。您目前没有使用锁定,即使您创建了锁定。而且,您只是加入了您开始的最后一个流程。现在它们可能很快结束,你不会看到问题,但是如果这些早期进程中的任何一个花费的时间比最后一个花费的时间长,那么你可能会在它们完成之前终止。
关于确保每个流程最终都在不同的核心上。不幸的是你不能。这是操作系统的调度程序将做出的决定。您只需编写使用多个进程的代码,以允许系统并行安排它们。有些人可能在同一个核心。
陷阱(pratfalls?),可能是你的实际代码并不真正需要多个进程,而是可以从线程中获益更多。此外,您必须非常小心如何在多处理中共享内存。进程间通信与线程间相关的开销更多。所以它通常被保留用于线程的情况根本无法满足你的需要。
答案 2 :(得分:0)
如果您使用的是unix系统,则可以尝试运行“top”命令并查看有多少进程同时显示。虽然它有点经验,但很多时候只需查看进程列表就可以看到倍数。
虽然查看了您的脚本,但我看不到您在哪里调用多个进程。您可以导入multiprocessing.pool然后将您的函数映射到不同的处理器 http://docs.python.org/library/multiprocessing.html