偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Python 并發(fā)編程從入門到進(jìn)階

開發(fā) 后端
Python有真正的多線程嗎?我本來(lái)以為是沒有的。因?yàn)镃Python解釋器本身就不是線程安全的,因此有全局解釋器鎖(GIL),一次只允許使用一個(gè)線程執(zhí)行Python字節(jié)碼。

[[439938]]

Python多線程

Python有真正的多線程嗎?我本來(lái)以為是沒有的。因?yàn)镃Python解釋器本身就不是線程安全的,因此有全局解釋器鎖(GIL),一次只允許使用一個(gè)線程執(zhí)行Python字節(jié)碼。換句話說(shuō),Python即便是有多線程,也會(huì)受GIL限制,按順序執(zhí)行。所以我就以為Python是沒有多線程的,也就是一個(gè)Python進(jìn)程不能同時(shí)使用多個(gè)CPU核心。然而,Python標(biāo)準(zhǔn)庫(kù)中所有執(zhí)行阻塞型I/O操作的函數(shù),在等待操作系統(tǒng)返回結(jié)果時(shí),都會(huì)釋放GIL,允許其他線程運(yùn)行。這就意味著Python線程在I/O密集型應(yīng)用中還是可以發(fā)揮作用的,比如一個(gè)Python線程等待網(wǎng)絡(luò)響應(yīng)時(shí),阻塞型I/O函數(shù)會(huì)釋放GIL,再運(yùn)行一個(gè)線程。再比如time.sleep()函數(shù)也會(huì)釋放GIL。

Python多進(jìn)程

但是對(duì)于CPU密集型應(yīng)用來(lái)說(shuō),要想利用所有可用的CPU核心,就得使用多進(jìn)程,規(guī)避GIL。

多線程與多進(jìn)程對(duì)比

什么時(shí)候用多線程?什么時(shí)候用多進(jìn)程?

I/O密集型應(yīng)用使用多線程,CPU密集型應(yīng)用使用多進(jìn)程。

什么是I/O密集型應(yīng)用?什么是CPU密集型應(yīng)用?

簡(jiǎn)單來(lái)說(shuō),I/O密集一般涉及到網(wǎng)絡(luò)、磁盤IO。而CPU密集指的是計(jì)算比較多。

創(chuàng)建多線程可以使用concurrent.futures,創(chuàng)建多進(jìn)程可以使用multiprocessing。

多線程與協(xié)程對(duì)比

多線程存在著切換開銷,同時(shí)為了避免寫變量沖突,在控制共享資源時(shí)需要加鎖,因此編寫程序會(huì)比較復(fù)雜比較困難。而協(xié)程是通過(guò)單線程實(shí)現(xiàn)的并發(fā),既能自由切換,也不需要鎖機(jī)制,執(zhí)行效率要高很多。

多線程和協(xié)程有個(gè)共同點(diǎn)是只對(duì)I/O密集型應(yīng)用有效,因?yàn)镚IL限制。如果想處理CPU密集型應(yīng)用,那么可以結(jié)合多進(jìn)程一起使用,以提高CPU使用率。

asyncio包

asyncio包比較多用來(lái)實(shí)現(xiàn)Python協(xié)程并發(fā),原書在這一章節(jié)引用了很多示例,穿插了很多代碼,導(dǎo)致我看起來(lái)有點(diǎn)亂,不是很清楚到底該怎么使用這個(gè)包。所以我看了一下官方文檔:

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

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

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

創(chuàng)建task的語(yǔ)法也發(fā)生了變化,可以用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. ... 

對(duì)于多個(gè)并行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()}] 得到執(zhí)行結(jié)果 {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()}] 得到執(zhí)行結(jié)果 {result}")) 

所以對(duì)于第三方包的學(xué)習(xí),最好是看看最新的官方文檔,說(shuō)不定已經(jīng)進(jìn)行了很多優(yōu)化。

 

最后,完結(jié),撒花。

 

責(zé)任編輯:武曉燕 來(lái)源: dongfanger
相關(guān)推薦

2023-12-26 08:40:06

分類算法數(shù)據(jù)分析Python

2022-03-23 08:45:20

系統(tǒng)性能CPU

2025-02-11 07:40:27

2023-02-10 09:40:36

Go語(yǔ)言并發(fā)

2022-07-15 16:31:49

Postman測(cè)試

2024-02-26 08:52:20

Python傳遞函數(shù)參數(shù)參數(shù)傳遞類型

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數(shù)據(jù)庫(kù)基礎(chǔ)

2020-07-07 10:50:19

Python丄則表達(dá)文本

2024-06-07 08:51:50

OpenPyXLPythonExcel文件

2025-05-07 10:10:00

SystemdLinux運(yùn)維

2012-02-29 00:49:06

Linux學(xué)習(xí)

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語(yǔ)句

2024-01-11 09:35:12

單元測(cè)試Python編程軟件開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)