大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
写在前面
并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语言的标配,而对于软件开发人员来说,没有玩过并发编程都会有点不好意思。本系列文章将会以C#语言为主,详细介绍并发编程。
什么是并发编程,其实很简单,并发编程就是在一台处理器上同时做多件事情,并发编程的目标就是充分利用处理器的每一个核,以达到最高的处理性能。举个例子,服务器在响应第一个请求的同时响应第二个请求。
关于并发编程的几个误解
误解一:并发编程就是多线程
实际上多线只是并发编程的一中形式,在C#中还有很多更实用、更方便的并发编程技术,包括异步编程、并行编程、TPL数据流、响应式编程等。
误解二:只有大型服务器程序才需要考虑并发
服务器端的大型程序要响应大量客户端的数据请求,当然要充分考虑并发。但是桌面程序和手机、平板等移动端应用同样需要考虑并发编程,因为它们是直接面向最终用户的,而现在用户对使用体验的要求越来越高。程序必须能随时响应用户的操作,尤其是在后台处理时(读写数据、与服务器通信等),这正是并发编程的目的之一。
误解三:并发编程很复杂、必须掌握很多底层技术
C# 和 .NET 提供了很多程序库,并发编程已经变得简单多了。尤其是 .NET 4.5 推出了全新的 async 和 await 关键字,使并发编程的代码减少到了最低限度。
并发编程的方向
多线程
线程是一个独立的运行单元,是操作系统中能够进行运算调度的最小单位,它包含于进程之中,是进程中的实际运行单位。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。现在的.NET程序都维护了一个线程池,里面有着一定数量的工作线程,这些线程等待着执行分配下来的任务,线程池也可以随时监测线程的数量,以备开发者根据业务情况灵活处理。
并行编程
并行编程主要用于分解计算密集型的任务片段,并将其分配给多个线程。前提是,程序中的任务可以分割成多个相互独立的任务块,关键字是相互独立,如果依赖太大,就不适合用并行编程。
并行编程利用CPU的空闲资源,充分提高了CPU的利用率,提高了系统的吞吐量。在大多数情况下,服务器本身就已经具备了并行处理能力,当通过编程进行并行处理的时候,需要慎重,因为使用不当将会导致内存溢出等风险,同时也会因为占用服务器资源而导致服务器本身的并行处理能力显著下降,严重的时候回导致系统无法使用。所以在进行编程的时候,尽量不要处理过长或者过短的任务。
并行处理分为数据并行和任务并行,其实他们都使用到了动态调整的分割算法,在任务分割后分配给工作线程。可以通过以下两种方式实现并行编程,一种是Parallel.ForEach以及更加优美的PLINQ,这是并行编程的推荐处理方式,并且它们自带自动分配任务的算法,可以在运行时进行调整;
在编写并行任务的时候,需要注意的是闭包所带来的风险。因为闭包捕获的是引用而不是值,所以可以在不经意间共享这些变量。一个比较好的处理就是,在使用闭包外的变量的时候,可以在闭包内定义局部变量,用以规避闭包带来的变量共享问题。
需要说明的是,线程池会根据需要增加线程数量,线程池采用的是工作窃取队列,以尽可能的达到高效
异步编程
目前最常用的异步编程模型是TAB编程(基于任务的编程模式)。异步编程提高了响应能力,也实现了可扩展性。比较直观的是,大家在处理Winform的时候遇到过界面卡死的情况,异步编程可以在程序运行的过程中继续相应用户的输入,而不会导致界面卡死,并提高了提高服务器端应用的TPS(Transactions Per Second)和 QPS (Queries Per Second)。
.NET4.5以后为异步编程引入了async和await关键字,async关键字加在方法声明上,主要用来配合方法内的await关键字,这两个关键字的引入,使得C#在异步编程上更加优雅。如下所示
public async Task DelayAsync() { await Task.Delay(1000); }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。