成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 并發編程從入門到進階

開發 后端
Python有真正的多線程嗎?我本來以為是沒有的。因為CPython解釋器本身就不是線程安全的,因此有全局解釋器鎖(GIL),一次只允許使用一個線程執行Python字節碼。

[[439938]]

Python多線程

Python有真正的多線程嗎?我本來以為是沒有的。因為CPython解釋器本身就不是線程安全的,因此有全局解釋器鎖(GIL),一次只允許使用一個線程執行Python字節碼。換句話說,Python即便是有多線程,也會受GIL限制,按順序執行。所以我就以為Python是沒有多線程的,也就是一個Python進程不能同時使用多個CPU核心。然而,Python標準庫中所有執行阻塞型I/O操作的函數,在等待操作系統返回結果時,都會釋放GIL,允許其他線程運行。這就意味著Python線程在I/O密集型應用中還是可以發揮作用的,比如一個Python線程等待網絡響應時,阻塞型I/O函數會釋放GIL,再運行一個線程。再比如time.sleep()函數也會釋放GIL。

Python多進程

但是對于CPU密集型應用來說,要想利用所有可用的CPU核心,就得使用多進程,規避GIL。

多線程與多進程對比

什么時候用多線程?什么時候用多進程?

I/O密集型應用使用多線程,CPU密集型應用使用多進程。

什么是I/O密集型應用?什么是CPU密集型應用?

簡單來說,I/O密集一般涉及到網絡、磁盤IO。而CPU密集指的是計算比較多。

創建多線程可以使用concurrent.futures,創建多進程可以使用multiprocessing。

多線程與協程對比

多線程存在著切換開銷,同時為了避免寫變量沖突,在控制共享資源時需要加鎖,因此編寫程序會比較復雜比較困難。而協程是通過單線程實現的并發,既能自由切換,也不需要鎖機制,執行效率要高很多。

多線程和協程有個共同點是只對I/O密集型應用有效,因為GIL限制。如果想處理CPU密集型應用,那么可以結合多進程一起使用,以提高CPU使用率。

asyncio包

asyncio包比較多用來實現Python協程并發,原書在這一章節引用了很多示例,穿插了很多代碼,導致我看起來有點亂,不是很清楚到底該怎么使用這個包。所以我看了一下官方文檔:

https://docs.python.org/3/library/asyncio.html

從Python3.5開始引入了async和await,替代了@asyncio.coroutine和yield from語法,語義更簡潔更明確了。并且從Python3.7開始引入了asyncio.run(),替代了這一串代碼:

  1. loop = asyncio.get_event_loop() 
  2. try: 
  3.     loop.run_until_complete(main()) 
  4. finally: 
  5.     loop.close() 

創建task的語法也發生了變化,可以用asyncio.create_task:

  1. async def coro(): 
  2.     ... 
  3.  
  4. In Python 3.7+ 
  5. task = asyncio.create_task(coro()) 
  6. ... 
  7.  
  8. # This works in all Python versions but is less readable 
  9. task = asyncio.ensure_future(coro()) 
  10. ... 

對于多個并行task可以用asyncio.gather,替代asyncio.wait:

  1. task_list = [] 
  2.     for i in range(5): 
  3.         task = asyncio.create_task(async_func(i)) 
  4.         task_list.append(task) 
  5.  
  6. done, pending = await asyncio.wait(task_list, timeout=None) 
  7. for done_task in done: 
  8.         print((f"[{current_time()}] 得到執行結果 {done_task.result()}")) 
  1. task_list = [] 
  2.     for i in range(5): 
  3.         task = asyncio.create_task(func(i)) 
  4.         task_list.append(task) 
  5. results = await asyncio.gather(*task_list) 
  6. for result in results: 
  7.         print((f"[{current_time()}] 得到執行結果 {result}")) 

所以對于第三方包的學習,最好是看看最新的官方文檔,說不定已經進行了很多優化。

 

最后,完結,撒花。

 

責任編輯:武曉燕 來源: dongfanger
相關推薦

2023-12-26 08:40:06

分類算法數據分析Python

2022-03-23 08:45:20

系統性能CPU

2025-02-11 07:40:27

2023-02-10 09:40:36

Go語言并發

2022-07-15 16:31:49

Postman測試

2024-02-26 08:52:20

Python傳遞函數參數參數傳遞類型

2011-06-07 10:33:11

Android Activity

2024-04-11 14:00:28

2023-09-22 22:43:26

eval()Python

2018-07-04 09:30:07

Python書籍程序員

2017-06-26 09:15:39

SQL數據庫基礎

2020-07-07 10:50:19

Python丄則表達文本

2024-06-07 08:51:50

OpenPyXLPythonExcel文件

2025-05-07 10:10:00

SystemdLinux運維

2012-02-29 00:49:06

Linux學習

2025-02-24 10:07:10

2024-11-25 18:37:09

2013-06-06 13:42:48

OSPF入門配置

2023-05-09 08:34:51

PythonWith語句

2024-01-11 09:35:12

單元測試Python編程軟件開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产特级毛片aaaaaa | 欧美jizzhd精品欧美巨大免费 | 婷婷免费视频 | 久久人人爽人人爽人人片av免费 | 欧美一区二区三区小说 | 精品国产一区久久 | 久久草在线视频 | 午夜二区| 一区二区精品 | 一级视频黄色 | а_天堂中文最新版地址 | 黄色毛片免费 | 久久91精品国产 | 久国产视频 | 日本精品久久久久久久 | 国产精品自拍视频 | 欧美精品在线一区二区三区 | 三级黄视频在线观看 | 日本 欧美 三级 高清 视频 | 精品一区在线 | 韩国av电影网| 国产98色在线 | 亚洲不卡在线观看 | 亚洲成人自拍 | 日韩一区不卡 | 天天躁日日躁狠狠躁白人 | 国产成人一区二区三区 | 日韩在线不卡 | 久久久久久久久久性 | 蜜桃av一区二区三区 | 免费人成在线观看网站 | 久久久免费精品 | 九色国产 | 国产www在线 | 日韩av一区二区在线观看 | 亚洲欧美男人天堂 | 国产精品视频一区二区三区不卡 | 亚洲美女天堂网 | 欧美片网站免费 | 国产精品精品视频一区二区三区 | 欧美久久久久 |