我怎么告诉一个多芯/多CPU机处理功能呼吁在一个循环平行?
-
09-06-2019 - |
题
我目前正在设计一个应用程序,有一个模块,这将负荷大量数据从一个数据库,并降低到一个更小的组通过各种计算根据的情况。
许多更深入行动的行为确定会借给自己的并行处理。
提供我有一个回路迭代的大量数据块到达的数据库和为每一个呼叫确定性功能而不侧的影响,我怎么会让这个程序并不等待功能返回而设置的下一个电话会,使他们可以并行处理?一个天真的做法证明该原则将做我现在。
我已经阅读谷歌的map/reduce纸的话,我可以使用的总原则在一些地方,我不会,对于现在的目标大的集群,而是要以一个单一的多核心或多CPU机版本1.0。所以,目前,我不知道如果我可以使用的图书馆或将要推出一个简单化下来的基本版本,我自己。
我在早期阶段的设计过程到目前为止,我针对C-东西(速度关键的位)和Python(用于生产率的关键位)作为我的语言。如果有令人信服的理由,我可能会换的,但到目前为止我很满意我的选择。
请注意,我知道的事实,它可能需要更长的时间来检索下一块从数据库中于处理当前和整个过程中将I/O限。我会的,但是,假设现在,它不是和在实践中使用数据库集群或记忆缓存或别的东西是不I/O-绑在这一点上。
解决方案
我可能会丢失的东西在这里,但这似乎相当直截了当使用这.
设立一个小型的线程池N程,并有一个线程,以控制他们所有。
主线只是坐在一个循环做的事情,如:
- 获得的数据块从数据库
- 找到下一个线程如果没有线是免费的,然后等待
- 一方面在组块的工作线程
- 回去获取下一块从数据库
在此期间的工作线程,他们当做:
- 标记自己是免费的
- 等待桅杆线以给我一块的数据
- 处理的大块的数据
- 标记自己自由了
该方法通过其实施本可以很简单,作为两个互斥的控阵列。一个有工作过程很(在线程池)以及其他指出,如果每一个相应的线是免费的或繁忙。
调整N到你喜欢的...
其他提示
好的,如果。净是一个选项,他们已经投入了大量的努力, 并行计算.
如果你还计划使用蟒蛇,你可能想看一看 处理.它使用过程,而不是线平行的计算(由于Python GIL)和提供的类分发"的工作项目"到几个过程。使用泳池类,你可以写的代码如下:
import processing
def worker(i):
return i*i
num_workers = 2
pool = processing.Pool(num_workers)
result = pool.imap(worker, range(100000))
这是一个并行版本的迭代.imap,其中分配呼吁过的进程。你也可以使用的apply_async方法的池和存储懒惰的结果的对象清单:
results = []
for i in range(10000):
results.append(pool.apply_async(worker, i))
为进一步参考,请参阅 该文件的游泳池类.
问题:
- 处理使用叉(),所以你必须要小心在Win32
- 目之间转移的进程需要pickleable
- 如果该工人被相对较快,你可以调整chunksize,即这些工作的项目发送给一个工作进程中的一个批
- 处理。游泳池的使用背景线
你可以实现的算法从Google的 Map/reduce 没有物理上分离机。只是考虑每个"机器"是"的螺纹。" 螺纹自动分布在多核心机。
如果你的工作有一个编译器,将支持它,我建议考虑看看 http://www.openmp.org 一种方式的注解你的代码,在这样一种方式 某些循环,将并行化。
它不会更多,你可能会发现它很有帮助的。
他们的网页的报告,gcc4.2将支持于为例。
一样的线的游泳池是使用。但是线在threadpools是serialisable并送到其他计算机和deserialised运行。
我已经开发了一个map/reduce图书馆为多螺纹/多核心使用一个单一的服务器。一切都照顾由图书馆和用户只有实施的地图和降低。它被定位为一个提高图书馆,但尚未被接受作为一个正式的lib。检查了 http://www.craighenderson.co.uk/mapreduce
你可能有兴趣在审查的码的 libdispatch, ,这是开放源执行情况的苹果中央派遣。
英特尔的TBB或提升::mpi可能是你感兴趣的。