版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本文首發(fā)地址: jackeygao.com
并發(fā)級(jí)別歸納為下列三種:
- 低級(jí)并發(fā)(Low-level Concurrency)
就是直接用『原子操作』(atomic operation)所實(shí)現(xiàn)的并發(fā)犁享。這種并發(fā)是給程序庫(kù)的編寫(xiě)者用的导帝, 而應(yīng)用程序開(kāi)發(fā)者則不需要它缕探,因?yàn)檫@種寫(xiě)法很容易出錯(cuò),而且極難調(diào)試佃迄。雖說(shuō)Python本身的并發(fā)機(jī)制一般是用底層的操作實(shí)現(xiàn)的, 但開(kāi)發(fā)者不能用Python語(yǔ)言編寫(xiě)這種級(jí)別的并發(fā)代碼夺饲。
- 中級(jí)并發(fā)(Mid-level Concurrency)
不直接使用原子操作装盯, 但卻會(huì)直接使用"鎖"(lock),大多數(shù)語(yǔ)言提供的都是這種級(jí)別的并發(fā)。Python的threading.Semaphore伺绽、threading.Lock及multiprocessing.Lock等類(lèi)都支持中級(jí)并發(fā)养泡。開(kāi)發(fā)應(yīng)用程序的人一般都會(huì)使用終極并發(fā)嗜湃,因?yàn)樗麄兺ǔV荒苁褂眠@個(gè)級(jí)別的并發(fā)功能。
- 高級(jí)并發(fā)(High-level Concurrency)
既不直接使用原子操作澜掩, 也不直接使用鎖(鎖與原子操作可能在幕后使用购披, 但開(kāi)發(fā)者無(wú)須關(guān)注這些。)目前已經(jīng)有編程語(yǔ)言開(kāi)始支持高級(jí)并發(fā)了肩榕。從3.2版本起刚陡,Python提供了支持高級(jí)并發(fā)的concurrent.futures模塊,此外株汉, queue.Queue及multiprocessing這兩個(gè)『隊(duì)列集合類(lèi)』(queue collection class)也支持高級(jí)并發(fā).
見(jiàn)解
中級(jí)并發(fā)是我經(jīng)常使用的筐乳, 這種并發(fā)等級(jí)雖說(shuō)使用起來(lái)相對(duì)低級(jí)并發(fā)簡(jiǎn)單, 但很容易出錯(cuò)乔妈, 容易出現(xiàn)那種難于追蹤而且調(diào)試起來(lái)非常復(fù)雜哥童。此外還會(huì)導(dǎo)致程序莫名的崩潰、失去響應(yīng)(frozen)或者僵尸(zombie)進(jìn)程.
關(guān)鍵問(wèn)題處在共享數(shù)據(jù)上面贮懈。如果共享數(shù)據(jù)可以修改,那么必須用鎖來(lái)保護(hù)优训,以確保所有線程和進(jìn)程都能按照順序來(lái)存取它(也就是說(shuō)你必須在程序里面控制好同一時(shí)刻必須有一個(gè)線程或進(jìn)程訪問(wèn)這份數(shù)據(jù))朵你。如果有多個(gè)線程或進(jìn)程試圖訪問(wèn)同一份共享數(shù)據(jù), 那么只有其中一個(gè)能夠獲取到揣非, 而其他的都會(huì)阻塞(也就是進(jìn)去『空閑狀態(tài)』(idle)狀態(tài))抡医。這就意味著當(dāng)鎖定機(jī)制生效時(shí), 應(yīng)用程序只有一個(gè)線程或進(jìn)程起作用(這就變得和非并發(fā)程序類(lèi)似了)早敬,其余都得等待忌傻。由此可見(jiàn)我們應(yīng)該進(jìn)程少用鎖,即便要用也不要時(shí)間太長(zhǎng),最簡(jiǎn)單的方法是根本不要分享可以修改的數(shù)據(jù)搞监, 使進(jìn)程本身只做運(yùn)算水孩,和I/O操作, 操作完后返回結(jié)果琐驴。這樣就不用加鎖了俘种, 而大部分并發(fā)問(wèn)題也就隨之消失了.