Retrofit+RxJava聯網工具類

  在python 進程、線程 (一)中簡單的說過,CPython中的GIL使得同一時刻只能有一個線程運行,即并發執行。并且即使是多核CPU,GIL使得同一個進程中的多個線程也無法映射到多個CPU上運行,這么做最初是為了安全著想,慢慢的也成為了限制CPython性能的問題。
  
  就像是一個線程想要執行,就必須得到GIL,否則就不能拿到CPU資源。但是也不是說一個線程在拿到CPU資源后就一勞永逸,在執行的過程中GIL可能會釋放并被其他線程獲取,所以說其它的線程會與本線程競爭CPU資源。
  
  在understand GIL:http://www.dabeaz.com/python/UnderstandingGIL.pdf中有關于GIL釋放和GIL的概要。
  
  多線程在python2中:當一個線程進行I/O的時候會釋放鎖,另外當ticks計數達到100(ticks可以看作是Python自身的一個計數器,也可對比著字節碼指令理解,專門做用于GIL,每次釋放后歸零,這個計數可以通過 sys.setcheckinterval 來調整)。鎖釋放之后,就涉及到線程的調度,線程的鎖進行,線程的切換。這是會消耗CPU資源,因此會造成程序性能問題和等待時延。特別是在CPU密集型代碼時。
  
  但是對于多進程,GIL就無法限制,多個進程可以再多個CPU上運行,充分利用多核優勢。事情往往是相對的,雖然可以充分利用多核優勢,但是進程之間的切換卻比線程的切換代價更高。
  
  所以選擇多線程還是多進程,主要還是看怎樣權衡代價,什么樣的情況。
  
  1、CPU密集代碼
  
  下面來利用斐波那契數列模擬CPU密集運算。
  
  def fib(n):
  
  # 求斐波那契數列的第n個值
  
  if n<=2:
  
  return 1
  
  return fib(n-1)+fib(n-2)
  
  <1>、多進程
  
  打印第25到35個斐波那契數,并計算程序運行時間
  
  import time
  
  from concurrent.futures import ThreadPoolExecutor, as_completed
  
  from concurrent.futures import ProcessPoolExecutor
  
  def fib(n):
  
  if n<=2:
  
  return 1
  
  return fib(n-1)+fib(n-2)
  
  if __name__ == "__main__":
  
  with ProcessPoolExecutor(3) as executor: # 使用進程池控制 每次執行3個進程
  
  all_task = [executor.submit(fib, (num)) for num in range(25,35)]
  
  start_time = time.time()
  
  for future in as_completed(all_task):
  
  data = future.result()
  
  print("exe result: {}".format(data))
  
  print("last time is: {}".format(time.time()-start_time))
  
  # 輸出
  
  exe result: 75025
  
  exe result: 121393
  
  exe result: 196418
  
  exe result: 317811
  
  exe result: 514229
  
  exe result: 832040
  
  exe result: 1346269
  
  exe result: 2178309
  
  exe result: 3524578
  
  exe result: 5702887
  
  last time is: 4.457437038421631
  
  輸出結果,每次打印三個exe result,總重打印十個結果,多進程運行時間為4.45秒
  
  <2>、多線程
  
  import time
  
  from concurrent.futures import ThreadPoolExecutor, as_completed
  
  from concurrent.futures import ProcessPoolExecutor
  
  def fib(n):
  
  if n<=2:
  
  return 1
  
  return fib(n-1)+fib(n-2)
  
  if __name__ == "__main__":
  
  with ThreadPoolExecutor(3) as executor: # 使用線程池控制 每次執行3個線程
  
  all_task = [executor.submit(fib, (num)) for num in range(25,35)]
  
  start_time = time.time()
  
  for future in as_completed(all_task):
  
  data = future.result()
  
  print("exe result: {www.gcyl152.com/ }".format(data))
  
  print("last time is: {}".format(time.time()-start_time))
  
  # 輸出
  
  exe result: 121393
  
  exe result: 75025
  
  exe result: 196418
  
  exe result: 317811
  
  exe result: 514229
  
  exe result: 832040
  
  exe result: 1346269
  
  exe result: 2178309
  
  exe result: 3524578
  
  exe result: 5702887
  
  last time is: 7.3467772006988525
  
  最終程序運行時間為7.34秒
  
  程序的執行之間與計算機的性能有關,每天計算機的執行時間都會有差異。從上述結果中看顯然多線程比多進程要耗費時間。這就是因為對于密集代碼(密集運算,循環語句等),tick計數很快達到100,GIL來回的釋放競爭,線程之間頻繁切換,所以對于密集代碼的執行中,多線程性能不如對進程。
  
  第一步導入依賴
  
  implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
  
  implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
  
  implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
  
  implementation 'cn.bingoogolapple:bga-banner:2.2.4@aar'
  
  創建BaseService
  
  import java.util.Map;
  
  import io.reactivex.Observable;
  
  import okhttp3.ResponseBody;
  
  import retrofit2.http.GET;
  
  import retrofit2.http.POST;
  
  import retrofit2.http.QueryMap;
  
  import retrofit2.http.Url;
  
  public interface BaseService {
  
  @GET
  
  Observable<ResponseBody> get(@Url String url, @QueryMap Map<String, String> map);
  
  @POST
  
  Observable<ResponseBody>www.gcyL157.com post(@Url www.michenggw.com String url, @QueryMap Map<String, String> map);
  
  工具類
  
  import java.io.IOException;
  
  import java.util.HashMap;
  
  import java.util.Map;
  
  import io.reactivex.Observer;
  
  import io.reactivex.www.yigouyule2.cn android.schedulers.AndroidSchedulers;
  
  import io.reactivex.disposables.Disposable;
  
  import io.reactivex.schedulers.Schedulers;
  
  import okhttp3.ResponseBody;
  
  import retrofit2.Retrofit;
  
  import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
  
  public class HttpHelper11 www.mhylpt.com{
  
  private BaseService mBaseService;
  
  public HttpHelper11(){
  
  Retrofit retrofit=new Retrofit.Builder()
  
  .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
  
  .baseUrl("http://www.zhaoapi.cn/")
  
  .build();
  
  mBaseService=retrofit.create(BaseService.class);
  
  }
  
  //get請求
  
  public HttpHelper11 get(String url, Map<String,String> map){
  
  if(map==null){
  
  map=new HashMap<>();
  
  }
  
  mBaseService.get(url,map)
  
  .subscribeOn(Schedulers.io(www.mcyllpt.com/))
  
  .observeOn(AndroidSchedulers.mainThread())
  
  .subscribe(observer);
  
  return this;
  
  }
  
  //post請求
  
  public HttpHelper11 post(String url, Map<String,String> map){
  
  if(map==null){
  
  map=new HashMap<www.dfgjyl.cn>();
  
  }
  
  mBaseService.post(url,map)
  
  .subscribeOn(Schedulers.io())
  
  .observeOn(AndroidSchedulers.mainThread())
  
  .subscribe(observer);
  
  return this;
  
  }
  
  private Observer observer=new Observer<ResponseBody>() {
  
  @Override
  
  public void onSubscribe(Disposable d) {
  
  }
  
  @Override
  
  public void onNext(ResponseBody responseBody) {
  
  try {
  
  String data= responseBody.string();
  
  listener.success(data);
  
  } catch (IOException e) {
  
  e.printStackTrace(www.365soke.com);
  
  }
  
  }
  
  @Override
  
  public void onError(Throwable e) {
  
  String error= e.getMessage();
  
  listener.fail(error);
  
  }
  
  @Override
  
  public void onComplete() {
  
  }
  
  };
  
  private HttpListener listener;
  
  public void result(HttpListener listener){
  
  this.listener=listener;
  
  }
  
  public interface HttpListener {
  
  void success(String data);
  
  void fail(String error);
  
  }
  
  }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

確定最佳聚類數matlab代碼_詳解DBSCAN聚類

使用DBSCAN標識為員工分組照片由Ishan seefromthesky 在 Unsplash拍攝基于密度的噪聲應用空間聚類(DBSCAN)是一種無監督的ML聚類算法。無監督的意思是它不使用預先標記的目標來聚類數據點。聚類是指試圖將相似的數據點分組到人工確定的組或簇中。它可以替代KMeans和層次聚類等流…

Arrays.asList 使用細節

通常初始化后使用如下&#xff0c;但是報錯 UnsupportOperationException.... 根據提示信息&#xff0c;就是調用add()方法時拋出了異常。順著堆棧信息往上找&#xff0c;提示的是AbstractList類的108行出了異常&#xff0c;這一行所在方法的具體實現如下&#xff1a; //108行 …

[分享] 精神崩潰的老鼠

李國棟床上堆著書&#xff0c;每天晚上睡在榻榻米上&#xff0c;讀書讀到凌晨一兩點&#xff0c;讀到兩眼充血&#xff0c;像針扎一樣痛苦&#xff0c;才把書放開。蜷縮到榻榻米上&#xff0c;用繩子把左腿跟一只桌腳綁在一起&#xff0c;熄了燈睡覺。 “這樣一來&#xff0…

(七)整合spring cloud云服務架構 - common-service 項目構建過程

我們將對common-service整個項目進行剖析&#xff0c;將整個構建的流程給記錄下來&#xff0c;讓更多的關注者來參考學習。首先在構建spring cloud的common-service之前&#xff0c;我們需要準備的技術&#xff1a;Maven&#xff08;項目構建&#xff09;、Spring Boot、Spring…

python list元素合并_python list 合并連接字符串的方法

python list 合并連接字符串的方法 更新時間&#xff1a;2013年03月09日 22:02:18 作者&#xff1a; python 列表合并字符串&#xff0c;我們一般會用到字符串的join方法來操作。下面通過代碼的形式&#xff0c;詳細的說下list怎么拼成字符串&#xff1f; 相關文章這篇文章主要…

修改citrix 默認偵聽端口的命令和XML Service端口

修改citrix 默認偵聽端口的命令&#xff1a; 在命令行下輸入icaport /port&#xff1a;2494&#xff0c;或你所想改成的端口 如果輸入 icaport /reset 恢復默認偵聽端口 ctxxmlss /r8080 在citrix的外部客戶端通過web方式登陸時&#xff0c;提示“the alternate address cannot…

spfa算法

1 轉載于:https://www.cnblogs.com/Emcikem/p/11346073.html

集成方法-概念理解

集成方法&#xff08;ensemble method&#xff09;又叫元算法&#xff08;meta-algorithm&#xff09;&#xff1a;將不同的分類器組合起來。 通俗的說&#xff1a;就是三個臭皮匠賽過諸葛亮。做決定時&#xff0c;考慮多個人的意見&#xff0c;不是一個人的意見 集成方法&…

單片機按鍵防抖程序_這些單片機按鍵設計方案,請拿好,不謝!

在單片機系統里&#xff0c;按鍵是常見的輸入設備&#xff0c;在本文中介紹幾種按鍵硬件、軟件設計方面的技巧。一般的在按鍵的設計上&#xff0c;一般有四種方案&#xff0c;創客學院帶你零基礎學習電子產品設計。一是GPIO口直接檢測單個按鍵&#xff0c;如圖1.1所示;二是按鍵…

Oracle 11G 安裝詳解

oracle官網下載地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官網下載需要注冊orcale賬號&#xff0c;比較繁瑣&#xff0c;這里直接放已經下載好的安裝包鏈接 Oracle11G下載鏈接: https://pan.baidu.com/s/1v6oD4jAt…

程序員何苦為難程序員?

有時候想想程序員為何為難程序員呢&#xff1f; 扳扳手指走上碼農這個行業也有幾年了&#xff0c;但是越來越覺得這個行業很累&#xff0c;有人說程序員就是二代農民工&#xff0c;我個人還是比較贊同的&#xff0c;對于剛入道的同仁們來說確實就是個體力(腦力&#xff0c;眼力…

kubeadm部署k8s_用 kubeadm 部署生產級 k8s 集群

概述kubeadm 已?持集群部署&#xff0c;且在1.13 版本中 GA&#xff0c;?持多 master&#xff0c;多 etcd 集群化部署&#xff0c;它也是官?最為推薦的部署?式&#xff0c;?來是由它的 sig 組來推進的&#xff0c;?來 kubeadm 在很多??確實很好的利?了 kubernetes 的許…

poj 題目分類

1000 AB Problem 送分題 1001 Exponentiation 高精度 1003 Hangover 送分題 1004 Financial Management 送分題 1005 I Think I Need a Houseboat 幾何 1006 Biorhythms 送分題 1007 …

模板的語法

我已經碰到過好幾次這種錯誤了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…

統計學習方法概論---分類問題

為什么80%的碼農都做不了架構師&#xff1f;>>> 分類問題 轉載于:https://my.oschina.net/liyangke/blog/2945185

IEPLUS(IE增強性插件)

用Vista好長好長時間了&#xff0c;除了比較吃硬件、老的游戲不兼容、我350W像素的老羅技不能用等等&#xff0c;感覺不是非常不錯的。IE 7也還可以&#xff0c;后來我試用了傲游、火狐&#xff0c;在多標簽后傲游的一些操作更人性化&#xff0c;我最喜歡它的托拉即可自動出新標…

CENTOS7 Python3.7 PyAudio 安裝

2019獨角獸企業重金招聘Python工程師標準>>> 出現錯誤: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -I/usr/local/python371/include/python3.7m -c src/_portaudiomodule.c -o build/temp.linux-aarch64-3.7/src/…

bash for循環_Bash 中的 For 循環

循環是編程語言的基本概念之一。當你想要一遍又一遍地運行一系列命令直到達到某個條件后終止退出時&#xff0c;循環很方便。在諸如 Bash 之類的腳本語言中&#xff0c;循環對于自動執行重復性任務非常有用。在 Bash 腳本中有3個基本的循環結構&#xff0c;for 循環&#xff0c…

Atlas Unknown Error

if("using Atlas" and "there are some js codes in HEAD tag") then "Unknown Error" solution: copy the js codes to other position 轉載于:https://www.cnblogs.com/JoeHou/archive/2009/02/03/1383231.html