1. 程式人生 > >同步呼叫和非同步呼叫

同步呼叫和非同步呼叫

我們知道,常見的方法呼叫都是同步呼叫,這種呼叫方式是一種阻塞式的呼叫方式,即客戶端(主呼叫方)程式碼一直阻塞等待直到被服務端(被呼叫方)返回 為止。這種呼叫方式相對比較直觀,也是大部分程式語言直接支援的一種呼叫方式。但是,如果我們面對是基於粗粒度的服務元件,面對的是一些需要比較長時間才 能有響應的應用場景,那麼我們就需要一種非阻塞式呼叫方式,即非同步呼叫方式。

SCA程式設計模式提供了三種方式的非同步呼叫,它們分別是:

1. 單向呼叫方式。

2. 延遲響應方式。

3. 請求回撥方式。

單向呼叫

單向呼叫方式是最為簡單的非同步呼叫方式,在這種呼叫方式中,客戶端發出請求之後就不再關心服務端的情況,包括是否執行成功,返回值是什麼等等。我們可以用下面的圖 4示來描述這種單向呼叫方式:

單向呼叫方式是一種不管呼叫結果的方式,但是在很多情況下我們是需要知道呼叫結果的。我們需要知道呼叫是否成功,需要知道呼叫的結果,就算呼叫失敗我們也希望知道錯誤程式碼等資訊。在這種情況下,延遲響應和請求回撥就是兩種能夠讓我們知道呼叫結果的方式。

延遲響應方式

延遲響應方式是指客戶端在發出呼叫請求之後繼續執行,但是經過一段時間之後,客戶端再呼叫相應的方法去檢索返回結果,並通過引數指定如何根據呼叫的 結果而執行進一步動作。由於是非同步呼叫方式,因此,在第一次發出呼叫請求的時候,服務端需要返回一個稱為票據(Ticket)的物件。這個物件會作為第二 次發出檢索結果請求時的一個引數。顯然,這個Ticket物件的作用與WEB程式設計的SessionID非常類似。我們可以用圖 5 來表示延遲相應呼叫方式:

相關推薦

C# 委託的同步呼叫非同步呼叫--抓住重點

委託的Invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。 同步呼叫的例子: using System; using System.Threading; public delegate int AddHandl

同步呼叫非同步呼叫

我們知道,常見的方法呼叫都是同步呼叫,這種呼叫方式是一種阻塞式的呼叫方式,即客戶端(主呼叫方)程式碼一直阻塞等待直到被服務端(被呼叫方)返回 為止。這種呼叫方式相對比較直觀,也是大部分程式語言直接支援的一種呼叫方式。但是,如果我們面對是基於粗粒度的服務元件,面對的是一些需

在Android中合理的使用Rxjava封裝同步非同步呼叫

同步和非同步的區別: 一般我們在程式中看到一些耗時的操作的方法,如果它有返回值等待呼叫者接收的情況就屬於同步呼叫此時當前執行緒會  阻塞在這裡等待結果的返回 非同步呼叫方法一般會呼叫方法是傳入響應的監聽器類listener通過介面回撥的方式來通知呼叫者結果而當前執行緒是不

C# 委託的三種呼叫示例(同步呼叫非同步呼叫非同步回撥)

首先,通過程式碼定義一個委託和下面三個示例將要呼叫的方法: 程式碼如下: public delegate int AddHandler(int a,int b); public class 加法類 { public static int A

一位牛人的多執行緒非同步呼叫文章 ~轉自部落格園的“小顧問”

首先申明:這篇文章不是我寫的,我看到的一位牛人的,自己慢慢的消化了……摘要:本章討論與智慧客戶端應用程式中多執行緒的使用有關的問題。為了最大限度地提高智慧客戶端應用程式的響應能力,需要仔細考慮如何和何時使用多執行緒。執行緒可以大大提高應用程式的可用性和效能,但是當您確定它們將如何與使用者介面互動時,需要對其進

同步呼叫非同步呼叫

同步呼叫和非同步呼叫是兩種提交任務的方式 同步呼叫:提交完任務後,就在原地等待任務執行完畢,拿到執行結果/返回值後再執行下一步,同步呼叫下任務是序列執行。 非同步呼叫:提交完任務後,不會再原地等待任務執行完畢,直接執行下一行程式碼,非同步呼叫時併發執行。 非同步呼叫,幾

spring cloud學習筆記3(同步呼叫非同步呼叫、響應式呼叫)

1.同步呼叫  同步呼叫,在學習筆記2就是同步呼叫 2.非同步呼叫 修改service package com.study.cloud.consumer.services; import com.netflix.hystrix.contrib.javanica.annot

tensorflow原始碼學習之五 -- 同步訓練非同步訓練

 同步和非同步訓練是由optimizer來決定的。         1. 同步訓練         同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org

執行緒同步非同步鎖的幾種方式

同步鎖:當在一個java虛擬機器多個執行緒操作一個變數的時候就會出現執行緒安全問題,這個時候就會用到同步鎖。 同步鎖的解決方式: 先看下一個執行緒異常的售票 public class ThreadSafe { public static void main(String[] arg

Mysql 半同步複製非同步複製

mysql 半同步複製和非同步複製 -- 在主庫中安裝半同步外掛,開啟半同步複製功能 install plugin rpl_semi_sync_master soname 'semisync_master.so'; set global rpl_semi_sync_master_enab

extjs中Ext.Ajax.request同步請求非同步請求

用Ext.Ajax.request請求預設是非同步請求,這就導致定義的物件無法識別,沒有定義,因此需要將請求方式改為同步。請看程式碼。 function showFormPanel(){ if(centerPanel.getSelectionModel().hasSelection()){

同步IO非同步IO、阻塞IO非阻塞IO

1、IO        IO (Input/Output,輸入/輸出)即資料的讀取(接收)或寫入(傳送)操作,通常使用者程序中的一個完整IO分為兩階段:使用者程序空

同步IO非同步IO

程式碼:VOID WINAPI APC_A ( DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo ){  pTempInfo.push_back ( "執行IO_A的完成例程" ) ;}VOID WINAPI APC_B ( DWORD dwError,

【Verilog】 同步復位非同步復位比較 async vs. sync

  同步復位 sync 非同步復位 async 特點 復位訊號只有在時鐘上升沿到來時才能有效。 無論時鐘沿是否到來,只要復位訊號有效,就進行復位。

同步任務非同步任務

程式裡面所有的任務,可以分成兩類:同步任務和非同步任務   同步任務是那些沒有被引擎掛起,在主執行緒上排隊執行的任務。 只有前一個任務執行完畢,才能執行後一個任務。  非同步任務是那些被引擎放在一邊,不進去主執行緒、而進入任務佇列的任務。只有 引擎認為某個非同

【solidity語言】為什麼在合約內部return this.屬性或方法不行的原因?(理解外部呼叫內部呼叫

contract Person { int[] public array; string public ss; function PersonTest1() public view returns(string) { this.array;

網路程式設計中,同步傳輸非同步傳輸有什麼區別

在網路通訊過程中,通訊雙方要交換資料,需要高度的協同工作。為了正確的解釋訊號,接收方必須確切地知道訊號應當何時接收和處理,因此定時是至關重要的。 在計算機網路中,定時的因素稱為位同步。同步是要接收方按照發送方傳送的每個位的起止時刻和速率來接收資料,否則會產生誤差。 通常可以

okhttp 同步請求非同步請求

一、使用OkHttp OkHttp傳送請求後,可以通過同步或非同步地方式獲取響應。下面就同步和非同步兩種方式進行介紹。 1.1、同步方式 傳送請求後,就會進入阻塞狀態,知道收到響應。下面看一個下載百度首頁的例子: OkHttpClient client = new

form表單同步提交非同步提交

同步提交: html: <form id="form" method='"post" action="${ctx}/user/saveUser"> <input type=

同步FIFO非同步FIFO的Verilog實現

module fifo2 (rdata, wfull, rempty, wdata, winc, wclk, wrst_n, rinc, rclk, rrst_n); parameter DSIZE = 8; parameter ASIZE = 4; output [DSIZE-1:0] rdata; out