1.4.3.2 使用 PLINQ 的声明式并行

1.4.3.2 使用 PLINQ 的声明式并行

 

声明式编程风格提供了另一种写并行程序的方法。我们知道,用声明式写代码,就是进行基元组成。在 LINQ 中,这些基元是查询运算符,比如 where 和 select。使用声明式风格,我们可以很容易替换基元的实现,PLINQ 就是这样做的:我们能够用并行的查询运算符替换标准查询运算符。

清单 1.9 是一个查询,更新虚拟游戏中的所有怪物,并删除上一步中死掉的怪物。[ 并行化的]改变非常简单,因此,我们可以用一个清单展示两个版本。

 

Listing 1.9 Parallelizing data processingcode using PLINQ (C#)

 

var updated =

  from m in monsters

  let nm = m.PerformStep()

  where nm.IsAlive select nm;

var updated =

  from m in monsters.AsParallel()  [1]

  let nm = m.PerformStep()

  where nm.IsAlive select nm;

在右侧的并行版本中,我们所做的唯一改变是添加了调用 AsParallel 方法[1],这个调用改变了查询运行时的基元,并使整段代码得以并行。在第十二章,我们将会看到其工作原理,并讨论声明式计算,第十四章重点关注并行式程序设计。

你可能会想,我们在程序中并不常用 LINQ 查询。绝对正确,因为在命令式程序中,LINQ 查询很少用;但是,在函数程序中,大都使用声明式风格处理数据。在 C# 中,可以写查询表达式,而F# 则提供了高阶列表处理函数(我们将在第五章和第六章所看到)。这意味着,你读过本书以后,在处理数据的时候,就可以更多地使用声明式编程,这样,你的程序将更容易实现并行化。

我们已经介绍了两种方法,能够用来简化函数式编程的并行化,这也是函数式思想在今天非常受人关注的原因之一,在第十三章和第十四章,我们还要再讨论这个问题以及相关主题。

在开始讨论真正的函数式程序之前,我们需要了解一下 F# 这种语言,首先看一下经典的 Hello world 程序,以及 F# 中的工具。下面一节将简要介绍开发 F# 解决方案的典型过程。

【C#】什么是并发,C#常规解决高并发的基本方法全栈小5于 2023-10-12 18:05:16 发布阅读量5.5k 收藏 46点赞数 24分类专栏: C# 文章标签: c# 并发版权C#专栏收录该内容132 篇文章订阅专栏给自己一个目标,然后坚持一段时间,总会有收获和感悟!在实际项目开发中,多少都会遇到高并发的情况,有可能是网络问题,连续点击鼠标无反应快速发起了N多次调用接口,导致极短时间内重复调用了多次接口进行添加或更新操作,这就会导致数据不完全的情况目录一、什么是并发二、并发场景1.1、Web服务器1.2、并发数据访问1.3、数据库访问1.4、并发任务处理1.5、并发消息处理1.6、并发网络通信1.7、大规模数据处理三、方法并发处理3.1、锁机制3.2、自旋锁3.3、读写锁3.4、并发集合3.5、异步编程一、什么是并发1.1、并发基本概念并发是指在计算机科学和信息技术领域中,同时处理多个任务或事件的能力。在并发计算中,多个任务可以同时进行,而不是按照严格的顺序执行。并发通常用于提高系统的性能、响应速度和资源利用率。在并发计算中,任务可以通过不同的方式同时进行,如多线程、多进程、异步编程等。多线程是指在一个程序中同时运行多个线程,每个线程独立执行不同的任务,共享同一进程的资源。多进程是指在一个系统中同时运行多个独立的进程,每个进程有自己的独立内存空间和资源。异步编程是一种基于事件驱动的编程范式,通过回调函数或事件循环来处理并发任务。并发可以提高系统的吞吐量和响应能力,使得用户可以在多个任务之间快速切换。然而,需要注意的是并发编程也可能引发一些特殊的问题,如竞态条件、死锁和资源争用等。因此,在开发并发程序时需要注意线程安全、同步机制和资源管理等问题。当系统中存在并发的时候,多个任务或事件可能会同时发生或重叠。这种情况下,需要一种机制来管理和控制这些任务的执行顺序、资源访问以及数据的一致性。在并发编程中,常用的处理并发的方法包括互斥锁、信号量、条件变量和原子操作等。互斥锁(Mutex)是一种用于保护共享资源的机制,它可以确保同一时间只有一个任务可以访问共享资源。信号量(Semaphore)是一种用于控制资源访问权限的机制,它可以限制同时访问共享资源的任务数量。条件变量(Condition Variable)用于在多个任务之间进行等待和通知的机制,它可以实现任务之间的同步和协作。原子操作是一种具有原子性(不可中断)的操作,它可以保证在并发环境中对共享资源的操作是线程安全的。另外,还有一些并发编程模型,如消息传递、共享内存和数据流等。消息传递模型是一种通过发送消息进行通信的方式,每个任务都有自己的消息队列,通过发送和接收消息来进行信息交换。共享内存模型是一种通过共享内存空间进行通信的方式,多个任务可以直接读写共享内存中的数据。数据流模型是一种通过数据流动来实现任务之间的通信和处理的方式,任务之间通过管道或通道进行数据传递。并发编程是一个复杂的领域,需要仔细考虑任务的相互影响、资源竞争、死锁和性能等因素。合理设计并发程序可以提高系统的效率和可扩展性,但如果处理不当,也可能引发各种问题。因此,在进行并发编程时,需要仔细分析和规划,并使用合适的并发处理机制和编程模型。二、并发场景在C#中,可以使用多线程、异步编程和并行计算等特性来实现高并发的场景。以下是一些常见的C#高并发的场景1.1、Web服务器C#可以用于开发高性能的Web服务器,通过多线程或异步编程处理并发请求,提高服务器的吞吐量和响应速度。1.2、并发数据访问当多个线程需要同时访问共享数据时,可以使用锁机制(如互斥锁、ReaderWriterLock)来确保数据的一致性和线程安全性。1.3、数据库访问
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值