标签: parallel-processing

C#的并行编程模式?

随着英特尔为台式机推出Hexa-Core(6)处理器,看起来我们已经不能再等待微软让多核编程"轻松"了.我刚刚订购了Joe Duffy的书"Concurrent Programming on Windows".这看起来是一个很好的起点,但是,我希望你们中有些人一直瞄准多个/多个核心系统会给我一些好的资源,这些资源已经或者对你的项目有所帮助?


你已经给出了一些很好的答案,但是,让我加上"好资源"的意思.仅仅因为我们有6,12或48个核心并不意味着我们的应用程序将从尝试使用它们中受益.我一直听说当我们的系统中有大量内核时,当前的编程范式将会发生变化.

我应该阅读哪些博客/书籍以最好地理解模式以及何时使用它们.是否有任何好的播客或网络广播可以提供帮助.


以下是我发现的一些有趣的链接:

一般有用:

多线程:

.net c# parallel-processing multithreading design-patterns

19
推荐指数
3
解决办法
4824
查看次数

rails分布式并行测试

如何在同一网络上通过SSH连接的双核机器上运行并行测试?

https://github.com/grosser/parallel_tests对本地工作人员运行良好,但无法在多台机器上运行它

https://github.com/qxjit/deep-test - 运行它时我没有运气,示例中有一条线就像

t.distributed_hosts
Run Code Online (Sandbox Code Playgroud)

这会引发错误

随着Hydra我有一个问题永远等待ssh工人

我尝试了自己的alpha版本,创建了一个测试回购并运行它,但没有运气

fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent …
Run Code Online (Sandbox Code Playgroud)

testing parallel-processing unit-testing ruby-on-rails

19
推荐指数
1
解决办法
1493
查看次数

在 swift 中使用 DispatchWorkItem 有什么好处?

假设我们有以下代码定义了一个连续循环(就像游戏一样):

let queue = DispatchQueue(label: "DemoSerialQueue")
let workItem = DispatchWorkItem{ print("Hello World") }
func gameLoop() {
  queue.async(execute:workItem)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在速度方面是否比以下代码更有效:

func gameLoop() {
  queue.async{ print("Hello World") }
}
Run Code Online (Sandbox Code Playgroud)

我特别想知道第二种形式是否会在每个循环上分配一个闭包,从而导致性能下降。

parallel-processing optimization swift

19
推荐指数
1
解决办法
8072
查看次数

使用 Parallel.ForEachAsync

我正在尝试运行 a Parallel.ForEachAsync(),但出现以下两个错误:

错误 1:
参数 2:无法从 System.Threading.Tasks.ParallelOptions 转换为 System.Threading.CancellationToken
错误 2:
Delegate Func<WC, CancellationToken, ValueTask> 不采用 1 个参数

这是我的代码:

public async Task<List<DisplayDto>> GetData()
{
    var options = new ParallelOptions()
    {
        MaxDegreeOfParallelism = 20;
    };

    await Parallel.ForEachAsync(result, options, async OrderNumber => {
        //Do Stuff here. 
    });
}
Run Code Online (Sandbox Code Playgroud)

为了使其按照我的要求工作,必须改变什么?

c# parallel-processing asynchronous parallel.foreachasync

19
推荐指数
1
解决办法
3万
查看次数

是否可以在执行Parallel.ForEach期间更改parallelOptions.MaxDegreeOfParallelism

我正在运行一个多线程循环:

protected ParallelOptions parallelOptions = new ParallelOptions();

parallelOptions.MaxDegreeOfParallelism = 2;
Parallel.ForEach(items, parallelOptions, item =>
{
// Loop code here
});
Run Code Online (Sandbox Code Playgroud)

我想在执行并行循环期间更改parallelOptions.MaxDegreeOfParallelism以减少或增加多个线程.

parallelOptions.MaxDegreeOfParallelism = 5;
Run Code Online (Sandbox Code Playgroud)

它似乎没有增加线程.有没有人有任何想法?

c# parallel-processing multithreading task-parallel-library

18
推荐指数
2
解决办法
1万
查看次数

使用JavaScript进行多核编程?

所以我有这个严格的递归函数,我想用我的代码.问题是它没有真正利用双核机器,因为js是单线程的.我曾尝试过使用webworkers,但对多核编程并不是很了解.有人会指出一些可以解释它是如何完成的材料.我google搜索这个示例链接,但没有文档它没有多大帮助!= /

如果有人能告诉我如何在没有网络工作者的情况下做到这一点,我会很高兴!那真是棒极了!=)

在whatwg上遇到了这个链接.这真的很奇怪,因为它解释了如何在webworkers等中使用多核编程,但是在我的chrome浏览器上执行它会引发错误.其他浏览器也是如此.

错误:9未捕获的ReferenceError:未在worker.js中定义Worker

javascript parallel-processing html5 web-worker

18
推荐指数
2
解决办法
8060
查看次数

.NET 4 ... Parallel.ForEach()问题

据我所知,新的TPL(任务并行库)已经实现了Parallel.ForEach(),因此它可以使用"表达的并行性".这意味着,它并不保证您的代理将在多个线程中运行,而是检查主机平台是否具有多个内核,如果为true,则仅在整个内核中分配工作(每个内核主要为1个线程) .

如果主机系统没有多个核心(越来越难以找到这样的计算机),那么它将像"常规"的foreach循环一样顺序运行你的代码.非常酷的东西,坦率地说.

通常我会做类似下面的事情来将我的长时间运行操作放在ThreadPool的后台线程上:

ThreadPool.QueueUserWorkItem(new WaitCallback(targetMethod),new Object2PassIn());

在主机只有单核的情况下,TPL的Parallel.ForEach()会自动将调用放在后台线程上吗?或者,我是否应该从后台调用任何TPL调用,以便如果我从单个核心计算机执行,那么至少该逻辑将不在GUI的调度线程中?

我担心的是,如果我让TPL负责所有这些,我想确保它确定它是一个单核心盒,它仍然将Parallel.ForEach()循环内部的代码编组到一个后台线程上,就像我一样完成,以免阻止我的GUI.

感谢您的任何想法或建议......

.net c# parallel-processing

18
推荐指数
1
解决办法
7925
查看次数

在后台线程/进程中调用函数(分叉)

我的代码有点像这样:

($i=0; $i < 100; $i++)
{
   do ($foo[$i]);
}
Run Code Online (Sandbox Code Playgroud)

以上是一项耗时的任务,我希望能够创建一个函数,并在下面调用它两次

function wrapper($start;$end)
{
    ($i=$start; $i < $end; $i++)
    {
       do ($foo[$i]);
    }
}
//have both of these run in parallel
wrapper(0,50);
wrapper(51,100);
Run Code Online (Sandbox Code Playgroud)

我看着Gearman,但我无法使用它,因为我无法安装gearman服务器(因为我在共享服务器上).似乎实现这一目标的方法是通过分叉.我尝试了很多关于它的内容,但文档和支持很少.任何帮助/线框代码将不胜感激.

为了定义我的问题,我如何调用wrapper()传递参数,以便它在子进程中执行.此外,重要的是我能够注册回调函数.

其他详细信息:PHP 5.3,在Linux服务器上运行.脚本由cgi-fcgi执行.

我认为这是我应该如何生成子进程,但是如何使用它来生成多个子进程?我如何注册回调函数?

$pid = pcntl_fork(); 

if ( $pid == -1 ) {        
    // Fork failed            
    exit(1); 
} else if ( $pid ) { 
    // The parent process
    //should I repeat this same code here to spawn another child process?

} else { …
Run Code Online (Sandbox Code Playgroud)

php parallel-processing fork

18
推荐指数
1
解决办法
2万
查看次数

C# - Parallel.Invoke和Parallel.ForEach本质上是一回事吗?

并且"同样的事情"我的意思是这两个操作基本上做同样的工作,它只是归结为哪个更方便根据你必须使用的工作来调用?(即代表列表或迭代的事项列表)?我一直在搜索MSDN,StackOverflow和各种随机文章,但我还没有找到一个明确的答案.

编辑: 我应该更清楚; 我问这两种方法是否做同样的事情,因为如果他们不这样做,我想了解哪种方法会更有效率.

示例:我有500个键值的列表.目前我使用foreach循环遍历列表(连续)并执行每个项目的工作.如果我想利用多个内核,我应该简单地使用Parallel.ForEach吗?让我们说为了参数的缘故,我为这500个任务组成了一个500个代表的数组 - 是否会产生任何不同的调用Parallel.Invoke,给它一个500个代表的列表?

提前谢谢了!

.net c# parallel-processing multithreading .net-4.0

18
推荐指数
2
解决办法
2万
查看次数

TParallel的奇怪行为.对于默认的ThreadPool

我正在尝试Delphi XE7 Update 1的并行编程功能.

我创建了一个简单的TParallel.For循环,基本上做了一些虚假的操作来消磨时间.

我在AWS实例(c4.8xlarge)上的36 vCPU上启动了该程序,试图了解并行编程的优势.

当我第一次启动程序并执行TParallel.For循环时,我看到了显着的增益(虽然admitelly比我预期的36个vCPU少很多):

Parallel matches: 23077072 in 242ms
Single Threaded matches: 23077072 in 2314ms
Run Code Online (Sandbox Code Playgroud)

如果我不关闭程序并在不久之后再次在36 vCPU机器上运行传递(例如,立即或大约10-20秒后),并行传递会恶化很多:

Parallel matches: 23077169 in 2322ms
Single Threaded matches: 23077169 in 2316ms
Run Code Online (Sandbox Code Playgroud)

如果我没有关闭程序并等待几分钟(不是几秒钟,但几分钟)再次运行传递之前,我再次得到第一次启动程序时得到的结果(响应时间提高了10倍) .

在36个vCPU机器上启动程序后的第一次传递总是更快,因此看起来这种效果仅TParallel.For在程序中第二次调用a时发生.

这是我正在运行的示例代码:

unit ParallelTests;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  System.Threading, System.SyncObjs, System.Diagnostics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    SingleThreadCheckBox: TCheckBox;
    ParallelCheckBox: TCheckBox;
    UnitsEdit: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { …
Run Code Online (Sandbox Code Playgroud)

delphi parallel-processing rtl-ppl

18
推荐指数
1
解决办法
2110
查看次数