python中線程和進程相關
1.操作系統/應用程序
a : 硬盤 , CPU , 主板 , 顯卡 , 內存 , 電源 ...
b.裝系統 (軟件)
系統就是一個由程序員寫出來的軟件 , 該軟件用於控制計算機的硬件 , 讓他們之間相互進行配合。
c.安軟件 (安裝應用程序)
百度雲
pycharm
....
2.操作中的"並發" (‘並行‘)
並發 , 偽 , 由於執行速度特別快 , 人感覺不到停頓。
並行 , 真 , 創建10個人同時操作。
3.其他語言線程 , 進程
a. 單進程 , 單線程的應用程序
print(‘666‘)
b.到底什麽是線程 ? 什麽是進程 ?
python自己沒有這個點西 , python中調用的操作系統的線程和進程
c.單進程 , 多進程的應用程序
代碼:
import threadin print(‘666‘) def func(arg): print(arg) t = threading.Thread(target=func) t.start() print(‘end‘)
一個應用程序 (軟件) , 可以有多個進程 (默認只有一個) , 一個進程中可以創建多個線程(默認一個) 。
d.故事 : 大神與甄嬛傳西遊記的故事
故事總結:
1.操作系統幫助開發者操作硬件。
2.程序員寫好代碼在操作系統上運行(依賴解釋器)
3.以前寫代碼:
import threading import requests import uuid url_list = [ ‘https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg‘, ‘https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg‘, ‘https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg‘, ]
def task(url):
""""""
"""
1.DNS解析 , 根據域名解析出IP
2.創建socket客戶端 sk = socket.socket.socket()
3.向服務端發起連接請求 sk.connect()
4.發送數據 (我要照片) sk.send(...)
5.接受數據 sk.recv(8096)
接受到數據後寫入文件。
示例 :
ret = requests.get(url) file_name = str(uuid.uuid4()) + ‘.jpg‘ with open(file_name, mode=‘wb‘) as f: f.write(ret.content) for url in url_list: task()
你寫好代碼
交給解釋器運行 : python s1.py
解釋器讀取代碼, 再交給操作系統去執行, 根據你的代碼去選擇創建多少個線程/進程去執行(單進程/單線程)
4.現在的你,寫代碼:
import threading import import uuid
url_list = [ ‘https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg‘, ‘https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg‘, ‘https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg‘, ] def task(url):
1.DNS解析, 根據域名解析出IP
2.創建socket客戶端 sk = socket.socket()
3.向服務端發起連接請求 sk = connect()
4.發送數據(我要照片) sk = send (....)
5.接受數據 sk.recv(8096)
接受數據寫入文件。
ret = requests.get(url) file_name = str(uuid.uuid4()) + ‘.jpg‘ with open(file_name, mode=‘wb‘) as f: f.write(ret.content) for url in url_list: task()
你寫好代碼
交給解釋器運行: python s1.py
解釋器讀取代碼,再交給操作系統去執行,根據你的代碼去選擇創建多少個線程/進程去執行(單進程/單線程)。
操作系統調用硬件:硬盤、cpu、網卡....
python 多線程情況下:
計算密集型操作:效率低 (GIL鎖)
IO操作:效率高
python多進程情況下:
計算密集型操作:效率高(浪費資源)
IO操作:效率高(浪費資源)
以後寫python時:
IO密集型用多線程 : 文件/輸入輸出/socket網絡通信
擴展:
Java多線程情況下:
計算密集型操作:效率高。
IO操作: 效率高
Python多進程的情況下:
計算密集型操作:效率高(浪費資源)。
IO操作: 效率高 浪費資源)。
4. Python中線程和進程(GIL鎖)
GIL鎖,全局解釋器鎖。用於限制一個進程中同一時刻只有一個線程被cpu調度。
擴展:默認GIL鎖在執行100個cpu指令(過期時間)。
5.python線程編寫
# 1. 計算密集型多線程無用 import threading v1 = [11,22,33] # +1 v2 = [44,55,66] # 100 def func(data,plus): for i in range(len(data)): data[i] = data[i] + plus t1 = threading.Thread(target=func,args=(v1,1)) t1.start() t2 = threading.Thread(target=func,args=(v2,100)) t2.start()
# 2. IO操作 多線程有用 import threading import requests import uuid url_list = [ ‘https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg‘, ‘https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg‘, ‘https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg‘, ] def task(url): ret = requests.get(url) file_name = str(uuid.uuid4()) + ‘.jpg‘ with open(file_name, mode=‘wb‘) as f: f.write(ret.content) for url in url_list: t = threading.Thread(target=task,args=(url,)) t.start()
1.應用程序/進程/線程 基礎了解
2.為什麽創建線程
由於線程是cpu工作的最小單元,創建線程可以利用多核優勢實現並行操作(Java/C#)。
註意:線程是為了工作。
3.為什麽創建進程
進程和進程之間做數據隔離(Java/c#)
註意 : 進程是為了提供環境讓線程工作
4. Python
a. Python中存在一個GIL鎖。
造成:多線程無法利用多核優勢。
解決:開多進程處理(浪費資源
總結:
IO密集型:多線程
計算密集型:多進程
b. 線程的創建
Thread
MyThread
c. 其他
join
setDeanon
setName
threading.current_thread()
d. 鎖
獲得
釋放
繼續完善
4.python中的線程和進程 (GIL鎖)
5.python 線程編寫 + 鎖
python中線程和進程相關