所以,标题描述了一切.
Seq.iter (fun item -> (*do something*)) sequence
Run Code Online (Sandbox Code Playgroud)
我可以将所有这些lambda函数作为并行运行吗?当这个函数做了一些大工作时,它会很有用.
假设我有一个n个元素的向量,我想在p进程上分发它,其中n不是p的倍数.每个进程的等级从0到p-1.如何确定每个流程上将有多少元素,以便更均匀地分配数据?
例如,如果n = 14且p = 4,我想要像[3,3,4,4]或[3,4,3,4]这样的分布,但不是[3,3,3,5]也不是[3,3,4,5] 4,4,4,2].
我想要一个函数f(n,p,r),它返回具有秩r的进程的元素数.
我已经尝试了这两个循环,并注意到即使Task的Action委托中的常规foreach循环应该并行执行,它也不会并行处理元素.但是,如果我用Parallel.ForEach替换它,我看到数据正在跨多个线程并行处理.
代码1:
Task loadingTask1 = Factory.StartNew(() =>
{
foreach (MyOneClass dg in Queue.GetConsumingEnumerable())
{
MyOtherClass vl = new MyOtherClass();
vl.Id = dg.Id;
vl.PerformTimeConsumingAction();
OutputQueue.Add(vl);
}
});
Run Code Online (Sandbox Code Playgroud)
代码2:
Task loadingTask2 = Factory.StartNew(() =>
{
Parallel.ForEach(Queue.GetConsumingEnumerable(), (dg) =>
{
MyOtherClass vl = new MyOtherClass();
vl.Id = dg.Id;
vl.PerformTimeConsumingAction();
OutputQueue.Add(vl);
});
});
Run Code Online (Sandbox Code Playgroud)
在每次迭代时使用Console.Write语句运行的代码1似乎等待上一个循环完成,直到它抓住下一个循环,但代码2确实并行处理多个元素.
我是否正确理解Task.Action中的常规foreach?我认为.NET将启动尽可能多的任务线程作为加载保证,并且每个迭代的foreach将被并行处理.
我也尝试将PLINQ结果传递给上述代码和观察者相同的行为:常规foreach似乎等待上一次迭代完成以启动下一个代码,即使我已经使用了.AsParallel()和.WithExecutionMode(ParallelExecutionMode.ForceParallelism)指令.
任何见解都将受到高度赞赏.我知道OrderingPartitioner类,可能会尝试使用它
我正在编写一个程序,需要递归搜索文件夹结构,并希望与多个线程并行执行.
我已经编写了相当简单的同步方法 - 最初将根目录添加到队列,然后将目录出列,对其子目录进行排队等,直到队列为空.我会用ConcurrentQueue<T>我的队列,但已经意识到我的循环会过早停止.第一个线程将使根目录出列,并且每个其他线程立即看到队列为空并退出,使第一个线程成为唯一运行的线程.我希望每个线程循环直到队列为空,然后等待另一个线程排队更多的目录,然后继续.我需要在循环中使用某种检查点,以便在每个线程都到达循环结束之前不会退出任何线程,但是我不确定最好的方法是在没有死锁的情况下执行此操作,而实际上没有更多的目录处理.
目前我有以下部分代码:
for i = 2:N-1
res(i) = k(i)/m(i)*x(i-1) -(c(i)+c(i+1))/m(i)*x(N+i) +e(i+1)/m(i)*x(i+1);
end
Run Code Online (Sandbox Code Playgroud)
其中变量k,m,c和e是大小为N的向量,x是大小为2*N的向量.使用像arrayfun这样的东西有没有办法更快地做到这一点!?我无法弄清楚这一点:(我特别想通过以后在GPU上运行来加快速度,因此,arrayfun也会有所帮助,因为matlab不支持并行化for循环而且我不想买夹克包...非常感谢!
它关于 http://en.wikipedia.org/wiki/Parallel_(software)和非常丰富的联机帮助页http://www.gnu.org/software/parallel/man.html
(for x in `cat list` ; do
do_something $x
done) | process_output
Run Code Online (Sandbox Code Playgroud)
被这取代
cat list | parallel do_something | process_output
Run Code Online (Sandbox Code Playgroud)
我正试图在此实现这一点
while [ "$n" -gt 0 ]
do
percentage=${"scale=2;(100-(($n / $end) * 100))"|bc -l}}
#get url from line specified by n from file done1
nextUrls=`sed -n "${n}p" < done1`
echo -ne "${percentage}% $n / $end urls saved going to line 1. current: $nextUrls\r"
# function that gets links from the url
getlinks $nextUrls
#save n
echo …Run Code Online (Sandbox Code Playgroud) 试图做一个"晕/鬼"行交换,我被一个死锁困住了(在图片下方的代码片段中).要交换的"光晕"行表示为深灰色线(在图中)和as hp[0]和hp[M-1](在代码中).
[无法发布图片; 没有足够的声誉.再次用文字表达:hp[0]并且hp[M-1]是"晕"行(即要交换的行),hp[1]而hp[M-2](和中间的所有行)都要用.计算.
为什么这个片段(适用于2个进程)可以解决3个进程的死锁问题?
// in-between processes ("P1" and "P2" in the picture;
// one of "P1" and "P2" is of course missing in the case of 3 processes)
if (p > 0 && p < P-1)
{
MPI_Sendrecv(hp[M-2], N, MPI_DOUBLE, p+1, 0,
hp[0], N, MPI_DOUBLE, p-1, 0, MPI_COMM_WORLD, &s);
MPI_Sendrecv(hp[1], N, MPI_DOUBLE, p-1, 1,
hp[M-1], N, MPI_DOUBLE, p+1, 1, MPI_COMM_WORLD, &s);
}
// root process ("P0" in …Run Code Online (Sandbox Code Playgroud) 我有一个需要在很多文件(1000's)上调用的函数.每个都独立于另一个,可以并行运行.每个文件的函数输出不需要与其他文件组合(当前).我有很多服务器可以扩展,但我不知道该怎么做:
1)在其上运行MapReduce
2)创建1000个作业(每个作业都有不同的文件).
一种解决方案会优于另一种吗?
谢谢!
我正在读一本关于并行编程的书,它说它不是线程保存,不使用锁而将元素添加到列表中,因为结果将是不可预测的.例如,如果我们必须将800,000个元素添加到列表中,则最终结果将少于800 000个元素.
现在我想知道是否是线程保存从列表中读取元素.例如,假设我有一个列表BlackListedNumbers
List<int> BlackListedNumbers = new List<int> {10, 50 ....... n};
//lets say there is 500 000 elements in the list
Run Code Online (Sandbox Code Playgroud)
和另一个Numbers包含10 000 000个数字的列表,显然我将使用parallel.Foreach来完成这个任务,我想要的是Final包含所有数字Numbers的BlackListedNumbers列表不在列表中
List<int> finalList = new List<int>();
Parallel.ForEach(Numbrs,
num =>
{
if (!blackListedNumbrs.Contains(num))
{
lock (finalList)
{
finalList.Add(num);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我知道这不是完成这项工作的最有效方法,但我只是想说明问题.
所以我的问题是:是否保存线程以从List中读取结果blackListedNumbrs并获得100%准确的结果?
我正试图弄清楚如何在java中进行多线程.现在,我的程序运行良好,没有并发,但我想实现多线程,以帮助加快它.
该程序运行单独子类的多个对象,并且每个对象的50%的时间评估花费在仅使用一个核而不是8个可用核的过程中.这些对象完全相互独立,但在程序中用作输入.
我试图通过让子类实现Runnable来多线程,然后让我的程序为每个这样的对象使用一个线程.这是正确的方法吗?
但是,java中的线程如何处理?每次运行后我是否需要处理线程?加入如何工作?
谢谢