
并行
文章平均质量分 56
心想才事成
这个作者很懒,什么都没留下…
展开
-
14 第十四章 写并行函数式程序
14 第十四章 写并行函数式程序本章介绍■ 用不可变数据简化并行化(parallelization)■ 处理任务并行库(Task Parallel library)■ 用 LINQ 以声明方式表达并行度(parallelism)■ 实现重载(overloaded)运算符 我们已经看到,许多赞成函数式编程的论据。原因之一就是,并行翻译 2011-11-29 19:30:36 · 809 阅读 · 0 评论 -
16.6 第十六章小结
16.6 第十六章小结 在本章中,我们介绍了函数方式技术开发有响应的应用程序。我们首先讨论在 F# 中的一等事件,把事件当成标准的值使用,可以传递给函数,或从函数返回。这样,可以使用高阶函数(比如,Observable.filter 和 Observable.map)处理事件,使代码更具声明性,与使用高阶函数或 LINQ 查询处理列表的方式相同。 对于更具动态的行为,这种翻译 2012-01-19 16:23:30 · 640 阅读 · 0 评论 -
16.5 消息并发传递
16.5 消息并发传递 当我们在第 14 章中讨论开发并发程序时,关注的技术是避免使用可变状态。没有可变状态,就可以并行地运行一个计算的几个部分,因为它们不会彼此干扰。这在许多能够以函数方式实现的数据处理问题时,工作地非常好,但在处理需要更频繁地交换信息时,也有问题。 最广为人知的解决方案是,使用共享内存(shared memory)和通过锁定保护访问共享的状态。用这种技翻译 2012-01-18 15:28:17 · 748 阅读 · 0 评论 -
16.5.2 并发访问邮箱
16.5.2 并发访问邮箱 邮箱处理器每次(很少)只处理一个邮件,但它可以安全地从多个线程访问。用于发布消息给处理器的所有方法(例如,Post 和 PostAndReply)都是线程安全的。让我们创建一个小应用程序,演示从三个线程并发访问我们的邮箱处理器。 清单 16.20 表示的情况是,有两个线程在重复地执行计算,然后,发送状态更新给邮箱处理器。为了使代码简单,我们的线翻译 2012-01-19 15:08:55 · 994 阅读 · 0 评论 -
测试 PSeq
测试 PSeq #light#r @"C:\Program Files\FSharpPowerPack-2.0.0.0\bin\FSharp.PowerPack.Parallel.Seq.dll"// // PSeq 在 Microsoft.FSharp.Collections 这个命名空间下open Microsoft.FSharp.Collectionslet n原创 2012-03-27 10:46:39 · 10006 阅读 · 0 评论 -
并行运行
并行运行let bufferData (number:int) = [| for count in 1 .. 1000 ->byte (count % 256) |] |> Array.permute (fun index -> index)let writeFiles bufferData = Seq.init 1000 (fun num ->原创 2012-07-22 15:14:55 · 743 阅读 · 0 评论 -
用 ScrapySharp 并行下载天涯图片
用 ScrapySharp 并行下载天涯图片#r "HtmlAgilityPack.dll"#r "ScrapySharp.dll"open Systemopen System.Threading.Tasksopen HtmlAgilityPackopen ScrapySharp.Extensionslet url = "http://bbs.ti原创 2014-01-31 23:02:34 · 3646 阅读 · 0 评论 -
第十章 并行编程
第十章并行编程 最近并行编程(parallel programming)已经不再是相对较晦涩的主题,由只能是专业开发人员精通,变得更为主流,这是因为日益流行多核处理器。在写作本书的时候,想买一台单核处理器 PC 机,已经几乎不可能,双核已是标配,四核处理器也开始出售,而未来几年内这种趋势还将继续完全在意料之中。在某些程度上,并行编程中的这种兴趣在带动了函数编程的新的兴趣。函数式编程当然翻译 2014-05-12 10:38:41 · 961 阅读 · 0 评论 -
数据并行(Data Parallelism)
数据并行(Data Parallelism) 数据并行,不同的数据输入以并行方式运行同一个函数,它把一个任务分解成不连续的单元,因此,可以在单独的线程上并行处理,保证这个任务可以在可用的处理之间进行分配。通常是处理数据集合,这种方法利用了集合中的项目自然提供了任务分配。最简单的情况,是一个并行的映射函数,对集合的中每一项应用一个转换,结果形成一个新的集合。这种简单的情况通常是可以工作的翻译 2014-05-14 11:10:59 · 10680 阅读 · 0 评论 -
异步使用 HTTP
异步使用 HTTP 到现在,我们所关注的还只是通过 HTTP 一次检索一个文档,或进行一次更新,在这种情况下,使用异步编程模式就没什么意义了。然而,我们通常的想法是一次能进行多个 HTTP 请求,这样,就可以从多个源检索、汇总数据,在这种情况下,使用 F# 的异步工作流,我们第一次碰到是在第十章“异步编程”一节,就能极大提高应用程序的性能。事实上,我们可能还希望能得到比使用本地磁盘更高的性翻译 2014-05-22 17:28:22 · 2526 阅读 · 0 评论 -
1.4.3.1 并行化不可变程序
1.4.3.1 并行化不可变程序 首先,让我们再看看清单 1.8,这是两段以函数方式写的游戏代码。在第一段,第二行用到了第一行的结果(运动后怪物的状态)。由于使用了不可变类,它没有给我们任何空间引入并行机制。第二段代码的两行是独立的。我们刚才说过,用函数式编程,独立的程序部分能够并行。现在,我们发现,不可变性对于找出哪些部分程序是独立的,是一个好方法。即使我们不知道任何细节,也可以看出翻译 2014-07-28 14:55:57 · 949 阅读 · 0 评论 -
1.4.3 编写有效的并行程序
1.4.3 编写有效的并行程序 函数式编程可以更方便编写并行程序,这可能是你打算阅读这本书的原因。在本节,我们将用几个示例来演示函数式程序如何使并行更容易。在前两个示例中,我们将使用 Parallel Extensions to .NET(.NET 的并行扩展),这是微软的一项新技术,用于编写并行化的应用程序,是 .NET 4.0 的一部分。如你所料,ParallelExtensions翻译 2014-07-28 10:22:24 · 1070 阅读 · 0 评论 -
14.3.5 以并行方式运行仿真
14.3.5 以并行方式运行仿真 要并行运行模拟,我们将使用 Task 基于任务的并行度,和使用 PLINQ (和 F# 中的 PSeq 模块)声明式并行度的组合。计算仿真的新状态,需要执行两个基本任务:移动所有动物,移动所有捕食者。有了 14.3.4 节的算法,这两个任务花大致相同的时间,所以,这在一代上双核的机器上就足够了。 把这个工作拆分为两个任务,并不翻译 2011-12-08 19:57:58 · 766 阅读 · 0 评论 -
14.3.3 实现辅助函数
14.3.3 实现辅助函数 在讨论计算动物位置的代码之前,我们要稍稍离题。我们需要实现几个函数,将由确定动物和捕食者位置的算法使用。出于各种用途,这些函数需要使用随机数,要正确地生成随机数,首先需要讨论如何安全地访问,那些不是线程安全(thread-safe)的对象。这可能是个问题,当我们处理具有可变状态的对象时,这是 .NET 类型的通常情况。 安全地访问翻译 2011-12-07 21:54:06 · 633 阅读 · 0 评论 -
14.1.1 并行以隔离命令式代码
14.1.1 并行以隔离命令式代码 在命令式编程中,可以很容易并行化的最常见结构是 for 循环。当循环的迭代独立(independent)时,我们可以在单独的线程上执行。由于独立,就是说,没有迭代会依靠由任何前面迭代所计算的值。 例如,当对数组中的元素求和时,我们需要所有以前元素的总和去计算下一个。(这仍可以并行,但不是那么简单。)回忆"模糊化"数组的函数,我们在第 1翻译 2011-12-01 14:21:52 · 1169 阅读 · 0 评论 -
14.1 理解不同的并行技术
14.1 理解不同的并行技术 在这一节中,我们会讨论三种技术,并使用简单的示例来演示。我们将使用 .NET 的并行扩展(Parallel Extensions to .NET),这是一个并行编程库。它是 .NET Framework 4.0 标准的一部分,但是,不幸的是,在早期 .NET 的版本中是不可用的。如果要使用 Visual Studio 2008,体验并行扩展,你可翻译 2011-11-30 22:02:25 · 1082 阅读 · 0 评论 -
14.1.2 声明性数据并行度(Declarative data parallelism)
14.1.2 声明性数据并行度(Declarative data parallelism) 声明风格编程背后的主要理念是代码不会指定它应该如何执行。执行由数量很少的基元被提供,比如,LINQ 中的 select 和 where,或者F# 中的 map 和 filter,这些基元的行为可能很复杂。 在第 1 章中, 我们演示过如何把一个普通的 LINQ 查询,修改成使用 P翻译 2011-12-02 16:38:56 · 680 阅读 · 0 评论 -
14.1.3 基于任务的并行度(task-based parallelism)
14.1.3 基于任务的并行度(task-based parallelism) 第 11 章中,我们看到,在函数式程序中,可以轻松地跟踪函数调用之间的依赖关系。一个函数或代码块可以做的唯一的事情,就是取值作为参数,并产生一个结果。如果我们想要找出一个调用是否依赖于于其他调用,可以检查它是否把第一个调用的输出作为自己输入的一部分。这可能要感谢使用了不可变的数据结构。如果第一个调用可以翻译 2011-12-03 18:12:05 · 884 阅读 · 0 评论 -
14.2 以并行方式运行的图形效果
14.2 以并行方式运行的图形效果 为了演示第一种技术,我们将开发需要并行处理大型数组的应用程序。一个大型数组的最简单的例子,是表示为一个二维数组的颜色的图像数据。我们在第 8 章中使用过相同的示例,当时是讨论以行为为中心的应用程序,但是,这一次我们将关注不同的方面。 用户将能够打开图像,从列表中选择一个滤镜,将其应用到图像。首先,我们会开发几个滤镜,然后,如何运行一个效翻译 2011-12-03 18:31:16 · 474 阅读 · 0 评论 -
14.2.1 F# 中的颜色计算
14.2.1 F# 中的颜色计算 若要实现图形效果,比如模糊或灰阶化,我们需要执行颜色的计算。我们可以使用 System.Drawing 中标准的 Color 类型,但是,我们可能需要把它分开成红色、绿色和蓝色的组件处理,这并不总是很方便。 有一种更自然的方式,在 F# 和 C# 中执行这些计算。我们可以使用运算符重载,实现我们自己的颜色类型。当我们在后面模翻译 2011-12-04 15:40:17 · 628 阅读 · 0 评论 -
14.2.6 实现模糊效果
14.2.6 实现模糊效果 我们最终的效果不只是一个颜色滤镜。模糊图像的过程依赖于计算新的像素值,基于多个原始像素。我们仍然可以执行逐个像素转换图像。不过,转型需要访问整个图像,以及我们想要转换的像素坐标。 我们把 RunEffect 和 RunEffectParallel 的实现留下作为练习,但它是相当简单的;这是只需改变循环的具体内容,给转换函数更多的信息翻译 2011-12-06 17:30:41 · 749 阅读 · 0 评论 -
14.3 创建并行仿真
14.3 创建并行仿真 我们的下一个示例应用程序打算仿真动物和捕食者的世界。捕食者的目标是让靠近动物去捕猎,而动物的目的是从世界范围逃跑。就像我们的图像处理示例一样,在这里,只显示最有趣的方面,完整的源代码在本书的网址上可用。 这是一个以数据为中心的应用程序,所以,第一个任务是确定主数据结构。在这种情况下,它是这个世界的"当前"状态的表示。这个世界实际上只有一个操作:实现时翻译 2011-12-06 19:52:46 · 625 阅读 · 0 评论 -
14.2.5 并行化应用程序
14.2.5 并行化应用程序 因为这一章是真正有关并行化的,这才是这个应用程序中的最有趣的部分。我们将讨论两种语言写的代码,首先以可能最简单的方法实现 C# 版本。 在 C# 中以并行方式运行滤镜 要实现 C# 版本,我们从清单 14.11 中把 RunFilter 方法拿过来,把 for 循环替换成对 Par翻译 2011-12-06 12:16:52 · 634 阅读 · 0 评论 -
14.3.1 表示仿真的世界
14.3.1 表示仿真的世界 我们的仿真世界是很简单的,它只包含动物和捕食者,因此,可以用两个列表来表示。原则上,我们还应该包括这个世界范围的宽度和高度,但是,我们使用固定的大小来,以使事情更简单。你可以得到有关这个世界更好地了解,我们试图通过图 14.3 来表示,它显示了仿真运行中的一个屏幕快照。图 14.3 运行中的念真,有 10 个捕食者(大圆圈),在翻译 2011-12-07 12:36:37 · 645 阅读 · 0 评论 -
14.3.2 设计仿真操作
14.3.2 设计仿真操作 在本节中,我们会考虑需要实现仿真的操作。现在,我们不会实现所有困难的操作,因为,我们只想要设计应用程序的结构。我们的首要目标是用最小的努力,运行这个应用程序,然后,再回到有趣的部分,比如,描述动物和捕食者的动作的算法。 以典型函数的方式,我们将从一些初始状态开始,并在每一步中,会基于上一个状态,创建新的状态。这意味着,我们需要一个操翻译 2011-12-07 17:40:16 · 923 阅读 · 0 评论 -
1.4.3.2 使用 PLINQ 的声明式并行
1.4.3.2 使用 PLINQ 的声明式并行 声明式编程风格提供了另一种写并行程序的方法。我们知道,用声明式写代码,就是进行基元组成。在 LINQ 中,这些基元是查询运算符,比如 where 和 select。使用声明式风格,我们可以很容易替换基元的实现,PLINQ 就是这样做的:我们能够用并行的查询运算符替换标准查询运算符。清单 1.9 是一个查询,更新虚拟游戏中的所有怪物,并删除翻译 2014-07-29 08:39:13 · 1037 阅读 · 0 评论