您可以通過查看頁面來判斷。 JSON序列化為每秒283,645。
但是,該數字幾乎沒有實際意義。
首先,典型的Web服務器執行諸如用戶身份驗證,數據庫訪問和HTML創建之類的過程,因此處理時間要長得多。 這僅意味著Sanic的處理時間可以忽略不計。
而且,在很多情況下,Web應用程序每秒需要超過1000個進程。 首先,諸如Niginx之類的Web服務器可以處理和緩存靜態文件。 如果這樣做,那麼您公司的10,000名員工的內部系統不太可能需要每秒處理1000個作業。
即使在現在,仍主要使用Dgango和Flask,因為它們在許多情況下通常就足夠了。 如果遇到問題,通常最好使用Go語言,該語言比在Python中使用Sanic更快,並且具有更多的並行處理功能。 請注意,這並不意味著不使用Sanic,而是如果每秒的進程數變得非常大,則Python本身通常不適合該進程。 。
感謝您的回答。
>通常,使用Go語言通常會更好,它比Python中使用Sanic更快,並且具有更多的並行處理功能。
>通常,使用Go語言通常會更好,它比Python中使用Sanic更快,並且具有更多的並行處理功能。
我一起看
結論
- GIL確保多線程不會從多核中受益。
如果這個博客是正確的,並且我們一起考慮,那麼Python是一種不利用多核CPU的編程語言。 如果您不需要AI(人工智能)或機器學習庫,則Go lang比Python更好,但是如果AI(人工智能)和機器學習庫針對Go lang,Python進行了增強我們希望將來能解決多核CPU的框架或正式支持。 Google還開發了一個名為TensorFlow for Go lang 的AI,機器學習和數值分析庫。 該API可以在Go lang中使用,但仍然只有Python可以構建和學習模型,因此我希望將來會對其進行改進。
就GIL而言,這通常不是問題,因為可以通過用C / C ++編寫或使用C / C ++編寫的庫來消除繁重的處理。 但是,如果每秒的操作數變得非常大,則無法避免處理衝突,並且Python效率低下。 因此,我只建議使用Go。 如果不是很大,那麼僅使用Python進行開發就不會有問題。 對於大規模應用,可能需要計算和測試Python是否能單獨承受和測試。
對於機器學習,訓練使用大量數據來進行大量計算。 在這方面,Python擅長Go,而擅長Go,因此Go將永遠無法構建和學習機器學習模型。
另一方面,在使用學習結果的過程中,由於僅使用結果,因此計算是輕量的。 如果您必須在此處處理大量處理,則可以使用Go的API,因為出於上述原因,Go更適合。
TesorFlow和Go都是由Google開發的,但這是考慮到Python和Go的特性的結果,因此最好將其統一。
顯示問題
受訪者介紹
閱讀Python3的博客是驗證。
也許吧
在Python2和3中,已驗證它與真實的多核和多線程(例如JAVA或Go lang(Go語言))不同,因為它是偽造的多核和多線程。
真正的具有uvloop的多核和多線程支持?
也許可以說。
怡安首席執行官石塚正宏
電話:042-559-8638
iPhone:070-3861-5011
找出為什麼asyncio使用POSIX線程
共享的。
Tokibito-sensei( id:nullpobug )叫到辦公室去玩,所以我們去了公開的收藏家。 我與aodag先生聊天 ( id:aodag ),但我記得我以前擔心過的事情。
我很擔心
在準備學習報告的演示文稿時,我準備了一個代碼示例,該示例使用asyncio和aiohttp向服務器發送HTTP請求。
導入 aiohttp 導入異步 異步def 提取 (l,url): 與 aiohttp.ClientSession(loop = l) 作為會話異步: 與 session.get(URL)異步作為響應: 返回等待response.text() 異步def main (l,url,num): 任務= [ 為 範圍 (num)中的_提取(l,url)] 返回等待asyncio.gather(*任務) 如果 __name__ == ' __main__ ' : 循環= asyncio.get_event_loop() 結果= loop.run_until_complete(主要(循環, 'http://本地主機:8000' , 3 )) 對於 r結果: 打印 (r)
PyCharm具有顯示“並發圖”的功能,可以檢查線程和進程的移動,執行該代碼時線程的行為如下。
由於某種原因,出現了current.futures.ThreadPoolExecutor。 我試圖找出文檔中寫的內容,但是由於找不到任何此類描述,我放棄了,問奧達格和託基比托。
socket.getaddrinfo
他在幾十分鐘內找到了原因。
socket.getaddrinfo
是同步執行的,因此cpython實現似乎不是異步執行此操作,而是concurrent.futures.ThreadPoolExecutor
多個線程中執行current.futures.ThreadPoolExecutor。- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L666-L673
- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L627-L636
導入異步 進口 aioredis 異步def connection_example (key): conn =等待aioredis.create_connection( '/tmp/redis.sock' ) return await conn.execute( 'GET' ,鍵) 異步def main (數字): 任務= [ 範圍 (num)中_的connection_example( 'my-key' )] 返回等待asyncio.gather(*任務) 如果 __name__ == ' __main__ ' : 循環= asyncio.get_event_loop() 結果= loop.run_until_complete(主要( 3 )) 對於 r結果: 打印 (r)
順便說一下,redis config是↓。
守護否 pidfile /var/run/redis.pid unixsocket /tmp/redis.sock unixsocketperm 700 日誌文件“” 數據庫1
看這時的並發圖,
當然,沒有創建線程。
訪問外部Redis服務器
另一方面,如果您在外部準備一個Redis服務器並連接它(這次我使用arukas.io ),
導入異步 進口 aioredis 異步def connection_example (key): conn =等待aioredis.create_connection( ( 'seaof-xxx-xxx.arukascloud.io' , 311390 ), db = 0 ,密碼= 'xxxxxxxxxxxxxxx' ) return await conn.execute( 'GET' ,鍵) 異步def main (數字): 任務= [ 範圍 (num)中_的connection_example( 'my-key' )] 返回等待asyncio.gather(*任務) 如果 __name__ == ' __main__ ' : 循環= asyncio.get_event_loop() 結果= loop.run_until_complete(主要( 3 )) 對於 r結果: 打印 (r)
執行後,如下所示。
似乎畢竟創建了一個工作線程。
為ThreadPoolExecutor創建了多少個工作線程?
將信號量中的同時執行次數限制為3時的並發圖如下。
顯然,ThreadPoolExecutor中的Thread不被重用。 ThreadPoolExecutor下的文檔中描述了它的創建程度。
如果max_workers為None或未指定,則默認值為計算機上的處理器數乘以5。17.4。Concurrent.futures –並發任務執行– Python 3.6.1文檔
我發送了大約30個試用請求(信號量為3)。
生成了多達20個,並確認此後它們已被重新使用。 儘管由於實現原因無法更改工作線程的上限,但是不太可能出現任何問題。
uvloop
至於uvloop,已確認他們不使用POSIX線程就可以工作。
導入 uvloop #省略 循環= uvloop.new_event_loop() asyncio.set_event_loop(循環)
執行後,
真的
結論
Aodag-sensei和tokibito-sensei太棒了……我正在閱讀文件,使文件潮濕,但是花了我十分鐘的時間才找到原因並告訴我。 從明天起我也是社會的一員,所以我要為兩個人努力。
奧達格先生和托比比托先生的公開收藏家似乎正在招聘工作。 謝謝你
0 コメント:
コメントを投稿