我有一个foreach循环,我正在并行化,我注意到一些奇怪的东西.代码看起来像
double sum = 0.0;
Parallel.ForEach(myCollection, arg =>
{
sum += ComplicatedFunction(arg);
});
// Use sum variable below
Run Code Online (Sandbox Code Playgroud)
当我使用常规foreach循环时,我会得到不同的结果.内部可能存在更深层次的内容,ComplicatedFunction但sum变量可能会受到并行化的意外影响?
如果我将作业添加到线程池中QueueUserWorkItem...如何在完成所有作业之前让我的程序继续运行?
我知道我可以添加一些逻辑来保持应用程序不运行直到所有作业都完成,但我想知道是否有类似的东西,Thread.Join()或者是否有任何方法可以检索正在分配作业的每个线程.
我广泛使用了大部分线程库.我非常熟悉创建新的Threads,创建BackgroundWorkers和使用内置的.NET ThreadPool(这些都非常酷).
但是,我从未找到使用Task类的理由.我看过可能有一两个人使用它们的例子,但是这些例子不是很清楚,并且没有给出为什么人们应该使用任务而不是新线程的高级概述.
问题1:从高级别开始,什么时候使用一个有用的任务而不是其他.NET并行方法?
问题2:是否有人有一个简单和/或中等难度的例子来演示如何使用任务?
c# parallel-processing multithreading task task-parallel-library
我正在调查特定操作完成所需的时间.操作如下:
Parallel.ForEach(items, item => SaveScheme(item));
Run Code Online (Sandbox Code Playgroud)
该SaveScheme方法适用于数据库:执行一些查询并处理信息.items收集中的元素数量可以足够大.
当我运行此操作时,大约需要20-40秒才能完成.但是当我打开一个配置文件运行它时,它只需要3秒!
我没有找到有关此问题的任何信息.我唯一的猜测是,分析Parallel.ForEach创建的线程多于没有它的线程,但我不确定,即使它是真的,我也不知道如何处理它.
那么,为什么会发生这种情况呢?当我在没有分析的情况下运行应用程序时,我怎样才能达到这种性能?
UPD.Parallel与此无关:我用简单测试,foreach操作仍然在3秒内完成!
我想知道在以下示例中有哪些替代方法可以避免死锁.以下示例是传输死锁问题的典型银行帐户.在实践中有哪些更好的解决方法?
class Account {
double balance;
int id;
public Account(int id, double balance){
this.balance = balance;
this.id = id;
}
void withdraw(double amount){
balance -= amount;
}
void deposit(double amount){
balance += amount;
}
}
class Main{
public static void main(String [] args){
final Account a = new Account(1,1000);
final Account b = new Account(2,300);
Thread a = new Thread(){
public void run(){
transfer(a,b,200);
}
};
Thread b = new Thread(){
public void run(){
transfer(b,a,300);
}
};
a.start();
b.start();
} …Run Code Online (Sandbox Code Playgroud) 我有一个Node应用程序,它访问静态的,大型(> 100M),复杂的内存数据结构,接受查询,然后通过HTTP向客户端提供一小部分数据.
大多数查询都可以在十分之一秒内得到解答.Hurray for Node!
但是,对于某些查询,搜索此数据结构需要几秒钟.这很糟糕,因为其他人都要等.
为了有效地为更多客户服务,我想使用某种并行性.
但是,因为这个数据结构太大了,我想在工作者或线程中分享它或者你有什么,所以我不会烧掉数百兆字节.这将是非常安全的,因为数据结构不会被写入.任何其他语言的典型'fork()'都可以.
但是,据我所知,在Node中进行并行化的所有标准方法都明确地使这变得不可能.为安全起见,他们不希望您分享任何东西.
但有办法吗?
背景:
将此数据结构放在数据库中,或使用memcached或类似的东西是不切实际的.
WebWorker API库和类似的只允许将短序列化消息传入和传出工作者.
Node的Cluster使用名为'fork'的调用,但它实际上不是现有进程的分支,而是生成一个新进程.所以再一次,没有共享内存.
可能真正正确的答案是使用类似文件系统的共享内存,即tmpfs或mmap.有一些节点库使mount()和mmap()可用于这样的事情.不幸的是,必须在同步搜索和读取之上实现复杂的数据结构访问.我的应用程序使用dicts数组的数组,依此类推.没有必要重新实现这一切将是很好的.
英特尔至强融核协处理器是否可用作并行平台,是否需要英特尔Composer XE编译器的许可证,或者是否有替代编译器?
hardware compiler-construction parallel-processing intel intel-mic
我正在尝试使用Python进行多处理器编程.Fibonacci例如,采用分治算法.程序流程的执行将像树一样分支并并行执行.换句话说,我们有一个嵌套并行性的例子.
从Java开始,我使用线程池模式来管理资源,因为程序可以非常快速地扩展并创建太多短期线程.可以通过实例化单个静态(共享)线程池 ExecutorService.
我希望Pool也一样,但看起来Pool对象不是全局共享的.例如,使用共享池multiprocessing.Manager.Namespace()将导致错误.
池对象不能在进程之间传递或被pickle
我有一个由两部分组成的问题:
from concurrent.futures import ThreadPoolExecutor
def fibonacci(n):
if n < 2:
return n
a = pool.submit(fibonacci, n - 1)
b = pool.submit(fibonacci, n - 2)
return a.result() + b.result()
def main():
global pool
N = int(10)
with ThreadPoolExecutor(2**N) as pool:
print(fibonacci(N))
main()
Run Code Online (Sandbox Code Playgroud)
Java的
public class FibTask implements Callable<Integer> {
public static ExecutorService pool = Executors.newCachedThreadPool();
int …Run Code Online (Sandbox Code Playgroud) 当我使用%dopar%调用自定义函数的foreach循环(使用)时,我遇到了问题.使用Linux时没有真正的问题,但是当我使用Windows时,无法找到自定义的功能.很难用文字解释这个问题,所以我写了一个小例子来展示它.假设我有三个简单函数的集合,其中FUN2(using %do%)和FUN3(using %dopar%)调用第一个函数(FUN):
FUN <- function(x,y,z) { x + y + z }
FUN2 <- function(a, b) {
foreach(i=1:3) %do% FUN(i, a, b)
}
FUN3 <- function(a, b) {
foreach(i=1:3) %dopar% FUN(i, a, b)
}
Run Code Online (Sandbox Code Playgroud)
这些函数存储在一个名为的脚本中foreach_testfunctions.R.在另一个脚本(foreach.test)中我发布了这些函数,使用library(doParallel)并尝试使用这些函数.首先我用Linux做,一切正常:
source("foreach_testfunctions.R")
a <- 2
b <- 3
library(doParallel)
registerDoParallel()
foreach(i=1:3) %do% FUN(i, a, b) ## works fine
FUN2(a, b) ## works fine
foreach(i=1:3) %dopar% FUN(i, a, b) ## …Run Code Online (Sandbox Code Playgroud) prova.mat在MATLAB中考虑以下列方式获得
for w=1:100
for p=1:9
A{p}=randn(100,1);
end
baseA_.A=A;
eval(['baseA.A' num2str(w) '= baseA_;'])
end
save(sprintf('prova.mat'),'-v7.3', 'baseA')
Run Code Online (Sandbox Code Playgroud)
为了了解我的数据中的实际维度,1x9 cellin A1由以下9数组组成:904x5, 913x5, 1722x5, 4136x5, 9180x5, 3174x5, 5970x5, 4455x5, 340068x5.另一个Aj有类似的构成.
请考虑以下代码
clear all
load prova
tic
parfor w=1:100
indA=sprintf('A%d', w);
Aarr=baseA.(indA).A;
Boot=[];
for p=1:9
C=randn(100,1).*Aarr{p};
Boot=[Boot; C];
end
D{w}=Boot;
end
toc
Run Code Online (Sandbox Code Playgroud)
如果我在我的Macbook Pro中parfor使用4本地工作人员运行循环,则需要1.2秒.parfor用for它替换需要0.01秒.
根据我的实际数据,时间差为31秒对7秒[矩阵的创建C也更复杂].
如果已正确理解问题是计算机必须发送baseA给每个本地工作人员,这需要时间和内存.
您能否提出一个能够parfor比方便更方便的解决方案for?我认为保存所有单元格baseA是一种通过在开始时加载一次来节省时间的方法,但也许我错了.