1. 程式人生 > >python中線程和進程相關

python中線程和進程相關

under args plus 代碼 並行 ups java aaa 擴展

1.操作系統/應用程序

  a : 硬盤 , CPU , 主板 , 顯卡 , 內存 , 電源 ...

  b.裝系統 (軟件)

    系統就是一個由程序員寫出來的軟件 , 該軟件用於控制計算機的硬件 , 讓他們之間相互進行配合。

  c.安軟件 (安裝應用程序)

    QQ

    百度雲

    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中線程和進程相關