2.17網路編程的複習

一、什麼是併發:html

看起來是同時運行的,在多個任務裏面來回切,切的時候保留上次的狀態

二、生產者和消費者模型:linux

使用生產者和消費者模式可以解決絕大多數併發問題 1、什麼是生產者與消費者模型? 答:生產者消費者模型是經過一個容器來解決生產者和消費者的強耦合問題, 生產者和消費者彼此之間不直接通訊,而經過阻塞隊列進行通訊。因此生產者 生產完數據以後不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要 數據,而是直接從阻塞隊列裏取。隊列就至關於一個緩衝區,平衡了生產者和消費者 的處理能力 2、爲何要有使用生產者和消費者模型? 答: 在多線程開發過程當中,若是生產者生產者處理速度很快,而消費者處理速度很慢, 那麼生產者必須等待消費者處理完,才能繼續生產數據。一樣的道理,若是消費者 處理能力大於生產者,那麼消費者得等到生產者。就這樣造成了相互等的形式。 爲了解決這個問題因此才引進了生產者和消費者模式

三、IPC(進程間的三種通訊方式):瀏覽器

方式一:隊列(推薦使用) - 隊列:隊列相似於一條管道,元素先進先出 須要注意的是:隊列都是在內存中操做,進程退出,隊列清空。另外,隊列也是一種阻塞的狀態 方式二:管道(不推薦) - 管道至關於隊列,可是管道不自動加鎖 方式三:共享數據(不推薦) - 共享數據也沒有自動加鎖的功能,因此仍是推薦用隊列。

四、實現併發有哪些手段?安全

一、開多進程:http://www.cnblogs.com/haiyan123/p/7445542.html 2、開多線程 3、進程池和線程池 進程池和線程池是用來控制進程和線程的數目的,若是你開的進程特別多,那麼你的機器就會很卡, 因此咱們得把進程控制好,用幾個開幾個,也不會太佔用內存。 p.close() #禁止往進程池內添加任務
四、協程gevent:單進程下實現併發

五、同步和異步:同步和異步就是提交任務的方式多線程

 同步:提交完任務以後在原地等着 異步:提交完任務以後就走了,不用等了,吧結果丟給了回調函數 #注意:等不必定就是阻塞了(像是計算的時間比較長就得等,但不是阻塞),當遇到IO了纔是阻塞

六、是否是全部的併發都更效率有關?併發

- 不是的,舉個例子來講明一下 舉例:假如如今有三個任務,他們都是計算密集型的,沒有遇到阻塞,他們串行這執行, 若是你用併發,他們之間還得來回的切,在這切的過程當中還會多產生切的時間,這倒不如用 串行效率高呢。因此:當沒有阻塞的時候,串行的效率比並發的效率高 - 那時候時候併發效率高呢? - 當遇到IO阻塞的時候,就讓等的時間去執行其餘的任務,這樣才涉及到效率,

七、協程:一個任務運行完,切到另外一個任務,單線程下實現併發異步

- 若是遇到IO才切, - yield爲協程提供了依據 協程參考連接:http://www.cnblogs.com/haiyan123/p/7461294.html

八、線程、協程、進程是否是真的存在呢?函數

線程、進程:是真的存在 協程:不存在,令人們意淫出來的

九、何時開多進程,何時開多線程?ui

  • IO密集型的,開多線程
  • 計算密集型的,用多進程

十、線程和進程的區別?spa

1、建立線程比建立進程開銷小(開一個進程,裏面就有空間了,而線程在進程裏面,就不必在開一個空間了) 2、多線程必定是在一個進程裏面開啓的,共享進程裏面的資源 3、線程啓動的速度快 4、同一進程下的多個線程共享進程的資源,而多個進程之間內存空間是隔離的 5、線程能夠跟它所在的進程以內 的線程通訊 #注意:在wins下開進程,子進程不會拷貝父進程進程的
      #在linux下開進程,子進程會徹底拷貝父進程的

十一、GIL全局解釋器鎖

GIL 與Lock是兩把鎖,保護的數據不同,前者是解釋器級別的(固然保護的就是解釋器級別的數據,好比垃圾回收的數據), 後者是保護用戶本身開發的應用程序的數據,很明顯GIL不負責這件事, 只能用戶自定義加鎖處理,即Lock #若是不加鎖:併發執行,速度快,數據不安全。

#加鎖:串行執行,速度慢,數據安全。

十二、鎖的格式

import threading mutex = threading.Lock() mutex.aquire() ''' 對公共數據的操做 ''' mutex.release()

1三、端口

http協議默認的端口是80 https(ssl)協議默認的端口是443,可是不用本身寫,瀏覽器會默認加上

相關文章
相關標籤/搜索