『壹』 python的問題
IDE選用這里推薦兩款常用的 IDE,可以按照自己的條件和場景來選擇。PyCharmPyCharm 是由 JetBrain 的人員製作的 IDE,該團隊負責最著名的 Java IDE,IntelliJ IDEA之一。PyCharm 的界面和功能對於那些有使用過其他 JetBrain 產品的人來說,是完美的。 此外,如果您喜歡 IPython 或 Anaconda 發行版,那麼 PyCharm 可以將其工具和庫(如NumPyMatplotlib)集成在一起,從而讓您可以使用數組查看器和互動式圖表。Thonny現在的開發工具太多了,而且每個開發工具都致力於做成最好用最智能的工具,所以功能越堆越多,越懟越智能。安裝這些開發工具比較燒腦,經常需要經過許多配置步驟。作為一個 Python 開發者來說,好多人光是這些配置都要弄半天。配置好之後,打開軟體,發現滿屏都是菜單、按鈕,無從下手,學習這些功能使用又是一大難題。這是一款對初學者特別友好的開發 IDE,它是由愛沙尼亞的 Tartu 大學開發,十分易於上手,還支持插件。如果你有編程基礎,會其他編程語言,那麼建議你用Pycharm。如果你是編程小白,或者零基礎上手,那麼建議你用Thonny。入門首先要學習Python基礎知識,直接上課程:Python 環境搭建Python 基礎語法Python 變數與數據類型Python 流程式控制制Python函數Python 模塊和包Python 數據結構--序列Python ListPython tupplePython 類與對象Python 字典Python 集合Python 函數的參數Python 高階函數Python 輸入輸出Python 錯誤和異常Python 之引用Python 之迭代器Python 之裝飾器Python NameSpace & ScopePython Standard Library 01Python Standard Library 02Python datetime 和 timePython 垃圾回收機制Python 到底是值傳遞還是引用傳遞Python 之對象的比較與拷貝進階通過上面基礎知識的學習,相信你已經知道Python是個什麼玩意了,對它也有一個初步的了解,對它的入門知識點也有些印象了。這時候你需要進階學習,在入門的基礎上更進一步。下面就從 Python 模塊、Python爬蟲基礎、Python Web開發、Python 資料庫操作、Python 數據分析及數據科學、Python IO及非同步、Python網路編程、Python圖像處理、Python 辦公、Python 機器學習、Python 可視化 這些Python的基礎大類來進行深入學習。Python 模塊Python os 模塊詳解Python shutil 模塊Python sys 模塊詳解Python queue 模塊詳解Python collections 模塊Python random 模塊Python logging 模塊詳解Python 枚舉Python json&picklepathlib 模塊Python calendar 模塊Python math 模塊Python decimal 模塊Python itertools 模塊Python statistics 模塊Python operator 模塊Python paramiko 模塊Python filecmp&difflib模塊初識 Python 多線程Python 多線程之 threading 模塊Python Queue 進階用法Python multiprocessing 模塊Python 線程池Python 多線程 EventPython爬蟲基礎爬蟲介紹Python 爬蟲之 urllib 包基本使用Python 用戶登錄 Flask-LoginPython Requests 庫的基本使用Python Requests 庫高級用法正則表達式XPath 和 lxml爬蟲利器 Beautiful Soup 之遍歷文檔PyQuery 詳解爬蟲利器 Beautiful Soup 之搜索文檔Selenium 環境配置Selenium詳解Python Scrapy 爬蟲框架及搭建Python Scrapy 項目實戰PySpider框架的使用Scrapy 模擬登陸Python 解析 XML爬取微信公眾號文章內容Python 爬取豆瓣電影 top 250Python newspaper 框架Python Web開發Web 開發 Flask 介紹Web開發 Jinja2模板引擎Flask 框架集成BootstrapWeb表單Flask數據持久化Web 開發 RESTfulPython Web開發 Django 簡介Python Django 模型概述與應用HTTP 入門Python Web 開發之 JWT 簡介Python Web開發 OAuth2.0 簡介OAuth2.0 客戶端實戰Flask 單元測試Web 開發 Django 管理工具Web 開發 Django 模板Flask 項目結構Python 資料庫操作Python 操作 Redis 資料庫介紹Python 操作 SQLitePython 操作 MongoDB 資料庫介紹Python 操作 MySQLPython SQLAlchemyPython 數據分析及數據科學數據分析之 Numpy 初步NumPy Ndarray 對象及數據類型NumPy 字元串操作NumPy 數學函數NumPy 統計函數NumPy 排序和篩選函數NumPy 位運算與算術函數數據分析之 pandas 初步NumPy 矩陣Numpy 中數組和矩陣的區別Python IO及非同步文件讀寫StringIO & BytesIOPython asyncioPython非同步之aiohttpPython網路編程TCP 編程UDP 編程Python圖像處理圖像庫 PIL(一)圖像庫 PIL(二)圖像庫 PIL 實例—驗證碼去噪Python 辦公Python 操作 ExcelPython 操作 WordPython 解析 PDFPython 操作 CSVPython 機器學習機器學習概覽第 112 天:機器學習演算法之蒙特卡洛Python XGBoost 演算法項目實戰三木板模型演算法項目實戰第116天:機器學習演算法之樸素貝葉斯理論機器學習演算法之 K 近鄰第120天:機器學習演算法之 K 均值聚類機器學習之決策樹Python 可視化Python matplotlib introctionPython Matplotlib 進階操作Seaborn-可視化統計關系Seaborn-可視化分類數據Seaborn-可視化數據集的分布實戰Python的知識點學完了之後,並不代表學完了。這只能代表你會Python了,並不能表示你可以去找工作、你可以去接單了。因為你還缺乏實戰練習,這個階段需要你能從一個實際需求中進行建模,然後用Python去實現模型,得到預期的結果。這里列一些貼近工作生活實際的小項目,每個項目都能讓你學習到如何進行需求建模,如何用代碼去實現,去解決實際的問題。解析網路網盤鏈接:幾行代碼,網盤鏈接提頭來見!揭露出軌女友:女友加班發自拍,男友用幾行代碼發現驚天秘密...爬取小程序:不能爬小程序,叫什麼會爬蟲解密當代女性胸圍:我半夜爬了嚴選的女性文胸數據,發現了驚天秘密製作簽名軟體:牛逼!用Python為她設計專屬簽名軟體!識別車牌:如何用 Python 識別車牌?追女神:用Python助女神發朋友圈下載知乎美女圖片:Python 抓取知乎幾千張小姐姐圖片是什麼體驗?炒股賺錢:一份代碼幫我賺了10萬寫小游戲:不到 150 行代碼寫一個 Python 版的貪吃蛇摳圖無煩惱:Python裝逼指南——五行代碼實現批量摳圖跟蹤房價數據:看我如何抓取最新房價數據跟女友惡作劇:女友電腦私存撕蔥帥照,我用python偷梁換柱...自動搶紅包:強大!用 60 行代碼自動搶微信紅包下載B站視頻:使用 Python 下載 B 站視頻更多精彩可以關注我的專欄:我是@無歡不散,看到這里的朋友請幫忙點個贊,也可以關注 @無歡不散 不迷路。
『貳』 python 什麼是非同步通信
非同步通信是一種很常用的通信方式。
相對於同步通信,非同步通信在發送字元時,所發送的字元之間的時隙可以是任意的,當然,接收端必須時刻做好接收的准備(如果接收端主機的電源都沒有加上,那麼發送端發送字元就沒有意義,因為接收端根本無法接收)。發送端可以在任意時刻開始發送字元,因此必須在每一個字元的開始和結束的地方加上標志,即加上開始位和停止位,以便使接收端能夠正確地將每一個字元接收下來。內部處理器在完成了相應的操作後,通過一個回調的機制,以便通知發送端發送的字元已經得到了回復。
『叄』 python2.7怎麼實現非同步
改進之前
之前,我的查詢步驟很簡單,就是:
前端提交查詢請求 --> 建立資料庫連接 --> 新建游標 --> 執行命令 --> 接受結果 --> 關閉游標、連接
這幾大步驟的順序執行。
這裡面當然問題很大:
建立資料庫連接實際上就是新建一個套接字。這是進程間通信的幾種方法里,開銷最大的了。
在「執行命令」和「接受結果」兩個步驟中,線程在阻塞在資料庫內部的運行過程中,資料庫連接和游標都處於閑置狀態。
這樣一來,每一次查詢都要順序的新建資料庫連接,都要阻塞在資料庫返回結果的過程中。當前端提交大量查詢請求時,查詢效率肯定是很低的。
第一次改進
之前的模塊里,問題最大的就是第一步——建立資料庫連接套接字了。如果能夠一次性建立連接,之後查詢能夠反復服用這個連接就好了。
所以,首先應該把資料庫查詢模塊作為一個單獨的守護進程去執行,而前端app作為主進程響應用戶的點擊操作。那麼兩條進程怎麼傳遞消息呢?翻了幾天Python文檔,終於構思出來:用隊列queue作為生產者(web前端)向消費者(資料庫後端)傳遞任務的渠道。生產者,會與SQL命令一起,同時傳遞一個管道pipe的連接對象,作為任務完成後,回傳結果的渠道。確保,任務的接收方與發送方保持一致。
作為第二個問題的解決方法,可以使用線程池來並發獲取任務隊列中的task,然後執行命令並回傳結果。
第二次改進
第一次改進的效果還是很明顯的,不用任何測試手段。直接點擊頁面鏈接,可以很直觀地感覺到反應速度有很明顯的加快。
但是對於第二個問題,使用線程池還是有些欠妥當。因為,CPython解釋器存在GIL問題,所有線程實際上都在一個解釋器進程里調度。線程稍微開多一點,解釋器進程就會頻繁的切換線程,而線程切換的開銷也不小。線程多一點,甚至會出現「抖動」問題(也就是剛剛喚醒一個線程,就進入掛起狀態,剛剛換到棧幀或內存的上下文,又被換回內存或者磁碟),效率大大降低。也就是說,線程池的並發量很有限。
試過了多進程、多線程,只能在單個線程里做文章了。
Python中的asyncio庫
Python里有大量的協程庫可以實現單線程內的並發操作,比如Twisted、Gevent等等。Python官方在3.5版本里提供了asyncio庫同樣可以實現協程並發。asyncio庫大大降低了Python中協程的實現難度,就像定義普通函數那樣就可以了,只是要在def前面多加一個async關鍵詞。async def函數中,需要阻塞在其他async def函數的位置前面可以加上await關鍵詞。
import asyncio
async def wait():
await asyncio.sleep(2)
async def execute(task):
process_task(task)
await wait()
continue_job()
async def函數的執行稍微麻煩點。需要首先獲取一個loop對象,然後由這個對象代為執行async def函數。
loop = asyncio.get_event_loop()
loop.run_until_complete(execute(task))
loop.close()
loop在執行execute(task)函數時,如果遇到await關鍵字,就會暫時掛起當前協程,轉而去執行其他阻塞在await關鍵詞的協程,從而實現協程並發。
不過需要注意的是,run_until_complete()函數本身是一個阻塞函數。也就是說,當前線程會等候一個run_until_complete()函數執行完畢之後,才會繼續執行下一部函數。所以下面這段代碼並不能並發執行。
for task in task_list:
loop.run_until_complete(task)
對與這個問題,asyncio庫也有相應的解決方案:gather函數。
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(execute(task))
for task in task_list]
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
當然了,async def函數的執行並不只有這兩種解決方案,還有call_soon與run_forever的配合執行等等,更多內容還請參考官方文檔。
Python下的I/O多路復用
協程,實際上,也存在上下文切換,只不過開銷很輕微。而I/O多路復用則完全不存在這個問題。
目前,Linux上比較火的I/O多路復用API要算epoll了。Tornado,就是通過調用C語言封裝的epoll庫,成功解決了C10K問題(當然還有Pypy的功勞)。
在Linux里查文檔,可以看到epoll只有三類函數,調用起來比較方便易懂。
創建epoll對象,並返回其對應的文件描述符(file descriptor)。
int epoll_create(int size);
int epoll_create1(int flags);
控制監聽事件。第一個參數epfd就對應於前面命令創建的epoll對象的文件描述符;第二個參數表示該命令要執行的動作:監聽事件的新增、修改或者刪除;第三個參數,是要監聽的文件對應的描述符;第四個,代表要監聽的事件。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
等候。這是一個阻塞函數,調用者會等候內核通知所注冊的事件被觸發。
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,
int maxevents, int timeout,
const sigset_t *sigmask);
在Python的select庫里:
select.epoll()對應於第一類創建函數;
epoll.register(),epoll.unregister(),epoll.modify()均是對控制函數epoll_ctl的封裝;
epoll.poll()則是對等候函數epoll_wait的封裝。
Python里epoll相關API的最大問題應該是在epoll.poll()。相比於其所封裝的epoll_wait,用戶無法手動指定要等候的事件,也就是後者的第二個參數struct epoll_event *events。沒法實現精確控制。因此只能使用替代方案:select.select()函數。
根據Python官方文檔,select.select(rlist, wlist, xlist[, timeout])是對Unix系統中select函數的直接調用,與C語言API的傳參很接近。前三個參數都是列表,其中的元素都是要注冊到內核的文件描述符。如果想用自定義類,就要確保實現了fileno()方法。
其分別對應於:
rlist: 等候直到可讀
wlist: 等候直到可寫
xlist: 等候直到異常。這個異常的定義,要查看系統文檔。
select.select(),類似於epoll.poll(),先注冊文件和事件,然後保持等候內核通知,是阻塞函數。
實際應用
Psycopg2庫支持對非同步和協程,但和一般情況下的用法略有區別。普通資料庫連接支持不同線程中的不同游標並發查詢;而非同步連接則不支持不同游標的同時查詢。所以非同步連接的不同游標之間必須使用I/O復用方法來協調調度。
所以,我的大致實現思路是這樣的:首先並發執行大量協程,從任務隊列中提取任務,再向連接池請求連接,創建游標,然後執行命令,並返回結果。在獲取游標和接受查詢結果之前,均要阻塞等候內核通知連接可用。
其中,連接池返回連接時,會根據引用連接的協程數量,返回負載最輕的連接。這也是自己定義AsyncConnectionPool類的目的。
我的代碼位於:bottle-blog/dbservice.py
存在問題
當然了,這個流程目前還一些問題。
首先就是每次輪詢拿到任務之後,都會走這么一個流程。
獲取連接 --> 新建游標 --> 執行任務 --> 關閉游標 --> 取消連接引用
本來,最好的情況應該是:在輪詢之前,就建好游標;在輪詢時,直接等候內核通知,執行相應任務。這樣可以減少輪詢時的任務量。但是如果協程提前對應好連接,那就不能保證在獲取任務時,保持各連接負載均衡了。
所以這一塊,還有工作要做。
還有就是epoll沒能用上,有些遺憾。
以後打算寫點C語言的內容,或者用Python/C API,或者用Ctypes包裝共享庫,來實現epoll的調用。
最後,請允許我吐槽一下Python的epoll相關文檔:簡直太弱了!!!必須看源碼才能弄清楚功能。
『肆』 python requests 是非同步的嗎
我找了一下requests本身沒有非同步功能有一個庫grequests,但網上就一個範例你需要把會發起請求的過程封裝成一個函數,然後用gevent.spawn調用。這個和多線程是類似的,只在一個Greenlet裡面當然還是順序執行的。
『伍』 做網路爬蟲,python 的多線程,非同步和 node.js 的非同步哪個好
非同步當然是Node.js遠強過Python的。
這主要體現在省去了線程調度時的內存等各方面的消耗。
另外Node.js在爬蟲市場的生態也逐漸成熟,而python依然是bs那一套。實際上js本身就更適合處理dom(cheerio\jsdom)
『陸』 【Python基礎】http請求是同步還是非同步
同步的
一般http請求都是同步,意味著你調用網路時候必須等著結果返回不能幹別的事
如果是非同步需要自己包裝,也有這樣的庫了
『柒』 python 什麼是http非同步請求
http請求為耗時IO操作,如果同步阻塞的話,進程會等待請求完成。
非同步的話,進程會發出http請求(請求以後不需要cpu),然後跳轉到別的任務,直到http請求完成,再調回來繼續處理得到的http回應。
最經典的例子就是燒水,同步阻塞就是你一直蹲在爐子旁邊等待水燒開,而非同步是把水壺放在爐子上,等水開了以後茶壺會叫,這時候你聽到聲音就會回來處理開水~