异步调用

异步调用与多线程的区别

馋奶兔 提交于 2020-03-28 05:31:28
  随着拥有多个硬线程CPU(超线程、双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。本文主要是想探讨一下如何使用并发来最大化程序的性能。    多线程和异步操作的异同   多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。多线程是实现异步的一个重要手段,但不是唯一手段,对以一个单线程程序也可以是异步执行的。    异步操作的本质   所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直 接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开 始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS 这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。异步编程的目的就是为了能够是实现并行

同步(Synchronous)和异步(Asynchronous)

Deadly 提交于 2020-03-28 03:55:15
同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息的传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。对于调用者来说异步调用似乎是一瞬间就完成了。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。 打个比方,比如我们去购物,如果你去商城实体店买一台空调,当你到了商场看中了一款空调,你就想售货员下单。售货员去仓库帮你调配物品。这天你热得实在不行了,就催着商家赶紧给你送货。于是你就等在商店里,候着他们,直到商家把你的空调和你一起送回家里,一次愉快的购物就结束了。这就是同步调用。 不过,如果我们赶时髦,就坐在家里打开电脑,在网上订购一台空调。当你完成网上支付的时候,对你来说购物过程已经结束了。虽然空调还没有到家,但是你的任务都已经完成了。商家接到了你的订单后,就会加紧安排送货当然这一切已经跟你无关了。你已经支付完成,想干什么就能去干什么,出去溜圈都不成问题,等送货上门的时候,接到商家的电话,回家一趟签收完事,这就是异步调用。 来源: https://www.cnblogs.com/loogr/p/7129167.html

delegate BeginInvoke& EndInvoke

核能气质少年 提交于 2020-03-23 15:49:17
.NET Framework 允许您异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。 BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述)。BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。 EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref 参数(在 Visual Basic 中为 <Out> ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。 注意 Visual Studio .NET 中的智能感知功能会显示 BeginInvoke 和 EndInvoke 的参数。如果您没有使用 Visual Studio 或类似的工具,或者您使用的是 C# 和 Visual Studio .NET,请参见异步方法签名获取有关运行库为这些方法定义的参数的描述。

C# BeginInvoke和EndInvoke方法

蹲街弑〆低调 提交于 2020-03-23 15:47:15
转载自: BeginInvoke和EndInvoke方法 IDE:Visual Studio 2008 本系列教程主要包括如下内容: 1. BeginInvoke和EndInvoke方法 2. Thread类 3. 线程池 4. 线程同步基础 5. 死锁 6. 线程同步的7种方法 7. 如何在线程中访问GUI组件 一、线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行。这就需要在同一个进程中开启多个线程。我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示。 如果任务管理器没有“线程数”列,可以【查看】>【选择列】来显示“线程计数”列。从上图可以看出,几乎所有的进程都拥有两个以上的线程。从而可以看出,线程是提供应用程序性能的重要手段之一,尤其在多核CPU的机器上尤为明显。 二、用委托(Delegate) 的BeginInvoke 和EndInvoke 方法操作线程 在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法

Spring Boot 异步请求和异步调用

此生再无相见时 提交于 2020-03-17 15:31:08
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门: https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 一、Spring Boot中异步请求的使用 1、异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。 一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲)。 2、异步请求的实现 方式一:Servlet方式实现异步请求 @RequestMapping(value = "/email/servletReq", method = GET) public void servletReq (HttpServletRequest request, HttpServletResponse response) { AsyncContext asyncContext = request.startAsync(); /

python实现异步调用函数

点点圈 提交于 2020-03-17 04:42:22
1 import time 2 from concurrent.futures import ThreadPoolExecutor 3 4 def RunBenchmark(url): 5 print('GET %s' % url) 6 response = url 7 time.sleep(3) 8 return(url+" FINISHED") 9 10 def RunPool(): 11 urls = 'CPU' 12 pool = ThreadPoolExecutor(1)          #启动一个线程池 13 task=pool.submit(RunBenchmark, urls)     #在另外的线程中运行RunBenchmark()  14 while(not task.done()):             #task.done()表示线程池中的工作完成了 15 print("ooo")                 #主线程中可以执行其他工作 16 time.sleep(0.5) 17 print("bye") 18 19 if __name__ == '__main__': 20 RunPool() https://www.jianshu.com/p/b9b3d66aa0be https://blog.csdn.net/sinat_34461756

异步编程

萝らか妹 提交于 2020-03-15 07:55:46
from: http://deeplythink.spaces.live.com/ using System; using System.Threading; public class AsyncDemo { //首先告诉大家下面的这个方法将会被异步调用。 public string TestMethod(int callDuration, out int threadId) { Console.WriteLine("Test method begins."); Thread.Sleep(callDuration); threadId = AppDomain.GetCurrentThreadId(); return "MyCallTime was " + callDuration.ToString(); } } // 这个委托必须和它即将异步调用的方法具有相同的签名。 public delegate string AsyncDelegate(int callDuration, out int threadId); (蓝字部分引自MSDN2003>NET Framework 开发员指南>异步编程概述) 第一方案:使用 EndInvoke 等待异步调用 异步执行方法的最简单方式是以 BeginInvoke 开始,对主线程执行一些操作,然后调用EndInvoke。EndInvoke

RPC调用和HTTP调用的区别

余生颓废 提交于 2020-03-11 20:23:19
很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单地介绍一下两种形式的C/S架构,先说一下他们最本质的区别,就是RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹啦!下面来具体说一说RPC服务和HTTP服务。 OSI网络七层模型 在说RPC和HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层: (从上到下) 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口; 第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等; 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断; 第四层:传输层。管理着网络中的端到端的数据传输; 第五层:网络层。定义网络设备间如何传输数据; 第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输; 第七层:物理层。这一层主要就是传输这些二进制数据。 实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面

Code-C#-Delegate:委托(delegate)的三种调用方式:同步调用,异步调用,异步回调

。_饼干妹妹 提交于 2020-03-08 13:34:54
ylbtech-Code-C#-Delegate:委托(delegate)的三种调用方式:同步调用,异步调用,异步回调 1. 返回顶部 1、 下面为即将被调用的方法: public delegate int AddHandler(int a, int b); public class 加法类 { public static int Add(int a, int b) { Console.WriteLine("开始计算:" + a + "+" + b); Thread.Sleep(1000); Console.WriteLine("计算完成!"); return a + b; } } 同步调用 : class Program { static void Main() { Console.WriteLine("===== 同步调用 SyncInvokeTest ====="); AddHandler handler = new AddHandler(加法类.Add); int result = handler.Invoke(1, 2); Console.WriteLine("继续做别的事情。。。"); Console.WriteLine(result); Console.ReadKey(); } } invoke后阻塞主进程,直到handler执行完毕; ===== 同步调用

使用BeginInvoke,EndInvoke异步调用委托

冷暖自知 提交于 2020-03-07 08:43:49
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main( string [] args) { Console.WriteLine( "Main ThreadId = " + Thread.CurrentThread.ManagedThreadId); //给委托赋值 Func< long , long > delegateMethod = new Func< long , long >(CalcSum); //异步执行委托,这里把委托本身作为asyncState对象传进去,在回调函数中需要使用委托的EndInvoke来获得结果 delegateMethod.BeginInvoke(200, DoneCallback, delegateMethod); //异步执行委托,抛出异常 delegateMethod.BeginInvoke(10000000000, DoneCallback, delegateMethod); Console.ReadLine(); } //委托回调函数 static