python中rim的用法_Python并发开发简介
Python的并發(fā)程序可以使用multiprocessing庫、threading庫、asyncio庫、concurrent.futures庫以及selectors庫等等協(xié)助編寫:
multiprocessing庫可以創(chuàng)建多個進程,由系統(tǒng)協(xié)調(diào)調(diào)度各個任務;
threading庫則是創(chuàng)建多個線程,由Python解釋器在一條進程內(nèi)并發(fā)執(zhí)行任務,始終只占用一個CPU核心資源,會遇到臭名昭著的GIL問題;
asyncio庫則是將任務中的IO密集部分單拎出來,系統(tǒng)可以在等待IO密集部分返回的同時多次執(zhí)行計算密集代碼,所有任務都在一條線程內(nèi)執(zhí)行;
concurrent.futures庫可以用來創(chuàng)建線程池或進程池,更適合編寫粒度較細的并發(fā)任務代碼。
selectors庫是對select庫的高級封裝;而后者則是對Unix的select、poll、Linux的epoll、BSD的Kqueue等等IO復用方法的低級封裝庫。
multiprocessing庫、threading庫、asyncio庫的有著類似的同步條件:Lock、RLock、Condition、Semaphore、Barrier、Event等:
Lock、RLock較為類似,可以用來將一組操作原子化。RLock的特殊之處在于,可以被同一條線程遞歸調(diào)用,當然用完之后也得遞歸解鎖。
Condition可以保證多組線程阻塞在同一位置,等候其他線程的通知,防止因為資源為空時發(fā)生錯誤。
Semaphore用于確保不會有過多線程同時訪問某一資源。
Barrier則用于保證所有線程各自在某一位置阻塞,當所有線程都阻塞時,又各自開始執(zhí)行下一條指令。
Event較為簡單,一條線程可能阻塞等候event對象被另一條線程設置為true。
線程的好處是有共享的內(nèi)存空間,方便線程間的交流。而進程則需要特殊的機制。multiprocessing庫提供了queue和pipe兩種機制用于進程間交流。這兩類的不同之處在于:queue的內(nèi)容可以被所有進程訪問到,pipe只能被兩個進程訪問到,信息的安全程度較高。multiprocessing庫還可以使用Manager對象為各個進程提供共享內(nèi)存空間。
此外,Python為線程提供了queue.Queue和collections.deque滿足線程的交流需求。后者的入隊出隊操作都是線程安全的。
而asyncio庫有自己的queue類可以用于協(xié)程間的交流。
asyncio庫的使用方法與前兩者區(qū)別較大。當調(diào)用async def定義協(xié)程函數(shù)時,內(nèi)部使用await等候另一個協(xié)程函數(shù)返回。使用asyncio協(xié)程庫需要清晰的區(qū)分出IO密集操作和計算密集操作,也就是手動調(diào)度并發(fā)任務。多線程庫則依靠解釋器自動調(diào)度并發(fā)任務。asyncio庫使用方法較為復雜,更多內(nèi)容請看官方文檔——18.5. asyncio – Asynchronous I/O, event loop, coroutines and tasks?。
concurrent.futures庫可以使用with語句來并發(fā)執(zhí)行粒度較細的并發(fā)任務,也可以使用submit()方法來單獨執(zhí)行一個函數(shù),返回一個future對象。future可以用于對對應任務的撤銷、結(jié)果傳遞、回調(diào)函數(shù)設置、異常分析等等操作。
總結(jié)
以上是生活随笔為你收集整理的python中rim的用法_Python并发开发简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 董小飒带领公会豪取《泰亚史诗》3大领地
- 下一篇: 剑网3英雄冰火岛副本打法指南 英雄冰火岛