『壹』 並發編程 下
進程是計算機中資源分配的最小單元;一個進程中可以有多個線程,同一個進程中的線程共享資源;
進程與進程之間則是相互隔離。
Python中通過多進程可以利用CPU的多核優勢,計算密集型操作適用於多進程。
關於在Python中基於multiprocessiong模塊操作的進程:
fork ,【「拷貝」幾乎所有資源】【支持文件對象/線程鎖等傳參】【unix】【任意位置開始】【快】
spawn ,【run參數傳必備資源】【不支持文件對象/線程鎖等傳參】【unix、win】【main代碼塊開始】【慢】
forkserver ,【run參數傳必備資源】【不支持文件對象/線程鎖等傳參】【部分unix】【main代碼塊開始】
官方文檔:https://docs.python.org/3/library/multiprocessing.html
示例1
示例2
案例:
進程的常見方法:
進程是資源分配的最小單元,每個進程中都維護自己獨立的數據,不共享。
如果想要讓他們之間進行共享,則可以藉助一些特殊的東西來實現。
Shared memory
Data can be stored in a shared memory map using Value or Array . For example, the following code【 數據可以使用Value或Array存儲在共享內存映射中。 例如下面的代碼 】
Server process
A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
【 manager()返回的管理器對象控制一個伺服器進程,該進程保存Python對象,並允許其他進程使用代理操作這些對象。 】
multiprocessing supports two types of communication channel between processes
【 支持兩種進程之間的通信通道 】
Queues
The Queue class is a near clone of queue.Queue . For example
Pipes
The Pipe() function returns a pair of connection objects connected by a pipe which by default is plex (two-way). For example:
函數返回一對由管道連接的連接對象,該管道默認為雙工(雙向)。 例如:
上述都是Python內部提供的進程之間數據共享和交換的機制,作為了解即可,在項目開發中很少使用,後期項目中一般會藉助第三方的來做資源的共享,例如:MySQL、redis等。
如果多個進程搶占式去做某些操作時候,為了防止操作出問題,可以通過進程鎖來避免。
很顯然,多進程在操作時就會出問題,此時就需要鎖來介入:
注意:如果在進程池中要使用進程鎖,則需要基於Manager中的Lock和RLock來實現。
暫時以了解為主。
計算機中提供了:線程、進程 用於實現並發編程(真實存在)。
協程(Coroutine),是程序員通過代碼搞出來的一個東西(非真實存在)。
協程也可以被稱為微線程,是一種用戶態內的上下文切換技術。
簡而言之,其實就是通過一個線程實現代碼塊相互切換執行(來回跳著執行)。
例如:
上述代碼是普通的函數定義和執行,按流程分別執行兩個函數中的代碼,並先後會輸出: 1、2、3、4 。
但如果介入協程技術那麼就可以實現函數見代碼切換執行,最終輸入: 1、3、2、4 。
在Python中有多種方式可以實現協程,例如:
雖然上述兩種都實現了協程,但這種編寫代碼的方式沒啥意義。
這種來回切換執行,可能反倒讓程序的執行速度更慢了(相比較於串列)。
協程如何才能更有意義呢?
通過上述內容發現,在處理IO請求時,協程通過一個線程就可以實現並發的操作。
現在很多Python中的框架都在支持協程,比如:FastAPI、Tornado、Sanic、Django 3、aiohttp等,企業開發使用的也越來越多(目前不是特別多)。
『貳』 epoll編程,如何實現高並發伺服器開發
首先,我們需要了解epoll編程的概念。epoll是一項對Linux內核進行的輪詢,以處理大量的文件描述符和一個增強版的Linux下多路復用IO介面選擇/投票。
一個成熟的高性能伺服器,epoll相關代碼,不到1萬分之一。在今天的posix和Unix /BSD/ systemv設計的回顧中,epoll補丁不應該被實現。非同步反應器框架應該只有一個簡單的、統一的選擇器。
5、是不是可以使用epoll技術跟多線程技術配合開發?如何?
6、系統應該怎樣開發使用TCP協議。
『叄』 java程序員面試時被問到:如何在j2ee項目中處理高並發量訪問 該怎麼回答 請仔細看題干再回答
你好,高並發系統的設計需要注意一下幾點:
盡量使用緩存,包括用戶緩存,信專息緩存等,多花點內存來做緩存,屬可以大量減少與資料庫的交互,提高性能。
用jprofiler等工具找出性能瓶頸,減少額外的開銷。
優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。
優化資料庫結構,多做索引,提高查詢效率。
統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。
能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。
解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。
基本上以上述問題解決後,達到系統最優。
至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。