<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 多并發(fā)分析

          共 2761字,需瀏覽 6分鐘

           ·

          2023-09-18 23:49

           文章所涉及內(nèi)容更多來自網(wǎng)絡(luò),在此聲明,并感謝知識(shí)的貢獻(xiàn)者!


          線程與進(jìn)程


          線程與進(jìn)程

          - 操作系統(tǒng)中,進(jìn)程是資源分配擁有的單位,線程是調(diào)度執(zhí)行的單位。
          - 線程是比進(jìn)程更小的一個(gè)運(yùn)行單位,一個(gè)進(jìn)程可以有多個(gè)線程,這些線程共享該進(jìn)程所擁有的資源。
          線程的出現(xiàn)主要是解決“同數(shù)據(jù)區(qū)同時(shí)處理多請(qǐng)求”,如果使用多個(gè)進(jìn)程,通信同步切換都太復(fù)雜,因此操作系統(tǒng)的設(shè)計(jì)者把進(jìn)程的兩個(gè)屬性分開,即作為調(diào)度執(zhí)行的基本單位,不再是資源分配擁有的單位。
          多進(jìn)程中,同一個(gè)變量,各自有一份拷貝存在于每個(gè)進(jìn)程中,互不影響。而多線程中,所有變量都由所有線程共享,所以,任何一個(gè)變量都可以被任何一個(gè)線程修改,需要格外強(qiáng)調(diào)互斥和同步。
          任何Python線程執(zhí)行前,必須先獲得GIL鎖,然后,每執(zhí)行100條字節(jié)碼,解釋器就自動(dòng)釋放GIL鎖,讓別的線程有機(jī)會(huì)執(zhí)行。正是由于GIL的存在,python多線程不能利用多核CPU,不過多進(jìn)程可以,每個(gè)進(jìn)程有自己的GIL鎖,有自己的變量,當(dāng)然多進(jìn)程帶來的切換更耗時(shí)。
          -多線程相比于單線程的意義:
          在計(jì)算密集型(如:矩陣運(yùn)算)任務(wù)上,python多線程性能堪憂;
          I/O密集(讀寫磁盤)任務(wù),才是python多線程的用武之地。因?yàn)镮/O操作,就會(huì)釋放GIL鎖,不會(huì)影響性能
          總之python多線程適合請(qǐng)求量很大,但單個(gè)請(qǐng)求處理時(shí)間短的任務(wù);多進(jìn)程適合處理計(jì)算密集型任務(wù)。

          多處理庫

          多處理庫:
          concurrenct.futures,ProcessPoolExecutor() ,ThreadPoolExecutor() , asyncio
          threading: 操作系統(tǒng)級(jí)線程的接口。受 CPU 限制的工作主要由GIL序列化,因此不要指望您的計(jì)算會(huì)加速。當(dāng)您需要并行調(diào)用阻塞 API 時(shí)使用它,特別是當(dāng)您需要控制線程創(chuàng)建時(shí)。避免創(chuàng)建太多線程,因?yàn)樗鼈兒馨嘿F。
          multiprocessing: 生成多個(gè) python 進(jìn)程的接口,其 API 有意類似于threading. 多個(gè)進(jìn)程并行工作,因此您實(shí)際上可以使用此方法加快計(jì)算速度。缺點(diǎn)是您不能在不使用多處理特定工具的情況下共享內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)。
          concurrent.futures:一個(gè)更現(xiàn)代的界面threading和multiprocessing,它提供了方便的線程/進(jìn)程池,它調(diào)用執(zhí)行者。池的主要入口點(diǎn)是submit返回句柄的方法,您可以測(cè)試該句柄是否完成或等待其結(jié)果。獲取結(jié)果將為您提供提交函數(shù)的返回值并正確傳播引發(fā)的異常(如果有),這對(duì)于threading. 在考慮基于線程或進(jìn)程的并行性時(shí),concurrent.futures 應(yīng)該是首選工具。
          asyncio:雖然之前的選項(xiàng)在提供非阻塞API的意義上是“異步的” (這是apply_async和其他人所指的),但他們?nèi)匀灰蕾嚲€程/進(jìn)程池來發(fā)揮他們的魔力,并且不能真正做更多的事情平行于他們?cè)诔刂械墓と恕syncio 全面使用單線程執(zhí)行和異步系統(tǒng)調(diào)用。它根本沒有阻塞調(diào)用,唯一的阻塞部分是asyncio.run()入口點(diǎn)。Asyncio 代碼通常使用協(xié)程編寫,協(xié)程使用await暫停直到有趣的事情發(fā)生。(掛起與阻塞不同,它允許事件循環(huán)線程在您等待時(shí)繼續(xù)執(zhí)行其他操作。)與基于線程的解決方案相比,它具有許多優(yōu)點(diǎn),例如能夠產(chǎn)生數(shù)千個(gè)廉價(jià)的“任務(wù)”而無需使系統(tǒng)陷入困境,并且能夠取消任務(wù)或輕松地同時(shí)等待多個(gè)事情。Asyncio 應(yīng)該是服務(wù)器和連接到多個(gè)服務(wù)器的客戶端的首選工具。
          在 asyncio 和多線程/多處理之間進(jìn)行選擇時(shí),請(qǐng)考慮“線程用于并行工作,而異步用于并行等待”的格言。

          concurrent.futures簡介


          concurrent.futures簡介
          concurrent.futures是3.2引入的新庫,在python的多線程threading、多進(jìn)程multiprocesssing上進(jìn)一步封裝,實(shí)現(xiàn)了進(jìn)程池和線程池。與multiprocessing.Pool(進(jìn)程池)不同的是,concurrent.futures實(shí)現(xiàn)的都是異步操作。
          concurrent.futures主要實(shí)現(xiàn)了進(jìn)程池和線程池,適合做派生一堆任務(wù),異步執(zhí)行完成后,再收集這些任務(wù),且保持相同的api,池的引入帶來了一定好處:
          - 程序開發(fā)更快,代碼簡潔,調(diào)調(diào)函數(shù)
          - 進(jìn)程線程復(fù)用,減去了大量開辟,刪除進(jìn)程線程時(shí)的開銷
          - 有效避免了因?yàn)閯?chuàng)建進(jìn)程線程過多,而導(dǎo)致負(fù)荷過大的問題
          concurrent.futures是重要的異步編程庫。內(nèi)部實(shí)現(xiàn)機(jī)制非常復(fù)雜,簡單來說就是開辟一個(gè)固定大小為n的進(jìn)程池/線程池。進(jìn)程池中最多執(zhí)行n個(gè)進(jìn)程/線程,當(dāng)任務(wù)完成后,從任務(wù)隊(duì)列中取新任務(wù)。若池滿,則排隊(duì)等待。

          asynico異步

          Asyncio
          協(xié)程
          協(xié)程是在用戶態(tài)實(shí)現(xiàn)的上下文切換技術(shù),因此操作系統(tǒng)不知道協(xié)程的存在。那么什么是上下文,簡單來說就是棧、寄存器、命名空間等等。線程、進(jìn)程就是操作系統(tǒng)幫你實(shí)現(xiàn)的上下文切換技術(shù),你無需關(guān)心進(jìn)程調(diào)度。
          線程缺點(diǎn):
          線程切換開銷太大(相比進(jìn)程還算小);為了同步互斥,線程要加信號(hào)量、鎖機(jī)制,性能下降;線程不夠靈活,操作系統(tǒng)持續(xù)地所有線程共享CPU時(shí)間,不管線程是否阻塞,出現(xiàn)忙等現(xiàn)象。
          協(xié)程機(jī)制:
          相比線程切換,協(xié)程上下文切換代價(jià)更小。
          協(xié)程是單線程的,不存在多線程互斥訪問共享變量,不用鎖、信號(hào)量等機(jī)制
          協(xié)程非常靈活,當(dāng)出現(xiàn)I/O阻塞時(shí),就去切換任務(wù),I/O完成再喚醒,這就是所謂的異步I/O,也就是避免了操作系統(tǒng)書上常說的cpu計(jì)算快,磁盤存取慢導(dǎo)致的速度不匹配。
          簡單概括,協(xié)程是為了代替線程而出現(xiàn)的。在用戶態(tài),實(shí)現(xiàn)的上下文切換技術(shù),只能跑在單線程上。
          協(xié)程只能跑在單線程,這是為了避免互斥訪問共享變量做的妥協(xié)。因此協(xié)程不適合做計(jì)算密集型任務(wù),它適合做I/O密集型任務(wù),asyncio就是異步I/O,講的就是I/O密集任務(wù)。

          參考資料

          參考資料:
          https://qa.1r1g.com/sf/ask/4294629111/
          https://zhuanlan.zhihu.com/p/438107406
          多線程
          https://zhuanlan.zhihu.com/p/437934916
          多進(jìn)程
          https://zhuanlan.zhihu.com/p/438551087
          concurrent.futures
          https://zhuanlan.zhihu.com/p/438627177
          asyncio
          https://zhuanlan.zhihu.com/p/438789871

          瀏覽 207
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  av无码在线观看 国产精品欧美性爱 | 99免费在线视频 | 大屌色 | 亚洲精品久久久国产精品久久久 | 特级西西444www大胆高清图片 |