![](/img/trans.png)
[英]Does it make sense to make a class in python when it would never get instantiated?
[英]When would not using asyncio make sense?
在什么情況下,一個線程或執行者(使用線程)會通過asyncio
?
隨着我使用Python(CPython)的經驗的進步,它集中於優化工作腳本以批量執行某種形式的Web服務調用並處理響應。 但是,經過幾代腳本構建之后,我發現自己想知道為什么我不使用最新版本?
請允許我在下面提供一些背景信息...
問題:從服務器A向客戶端B請求N個文件,進行處理並將其保存到磁盤。
依序
多線程
線程池執行器
as_completed()
使用Queue和Thread結構 異步
run_in_executor()
保存到磁盤 因此,我們已經來到了我目前的困境:為什么我會永遠不想使用asyncio
為I / O密集型的工作?
異步編程是一個非常類似於OOP的概念,解決方案3的文檔甚至說“異步執行可以通過線程執行”。 但是,如果我可以在單個線程上實現異步執行(不包括用於阻止對磁盤的I / O的其他線程),為什么還要使用解決方案1-3?
我知道在GIL的情況下,CPython多線程是次優的; 無論如何,我認為沒有理由再有人使用線程或執行程序了。 我做了很多谷歌搜索,看是否能找到一篇很好的文章,說明為什么人們更喜歡使用它們,但是我只發現了一些文章,說明為什么線程(以及隨后使用線程的執行程序)很糟糕:上下文切換( GIL / OS),競爭條件,資源匱乏等...
由於CPython不使用線程來利用多個核心CPU(我相信這是multiprocessing
庫),因此線程不用於繁重的計算任務。 因此,將它們限制在I / O限制的操作中以提高性能。 但是,這並沒有給我足夠的理由來理解為什么要在asyncio
上使用線程或執行asyncio
。
如果您可以在單個線程中(可能是2-3個)完成所有操作,為什么還要繼續引入創建,管理和銷毀線程的開銷(無論是顯式的還是通過池/執行器的)?
我認為多線程和異步之間的決定確實取決於您需要哪種多任務。 如果一切都在程序的控制之下,那么異步/多處理可能一直都是正確的選擇。 但是,也許您想開始一項任務,在此前提下,多任務處理是正確的選擇。 例如,您在第三方庫中啟動任務。 使用線程的一個顯而易見的原因是該庫不支持asyncio。 但是,即使它支持異步,您也許也不想信任該庫來隨心所欲地控制您的任務。 然后,您可以使用另一個運行該代碼的asyncio事件循環來啟動新線程。
因此,我認為真正的問題是:何時使用協作以及何時使用搶占式多任務處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.