Python編程threading多線程

      網(wǎng)友投稿 725 2022-05-30

      進(jìn)程process:應(yīng)用程序以一個(gè)整體的形式暴露給操作系統(tǒng)管理,里邊包含對(duì)各種資源的調(diào)用,內(nèi)存的分配,對(duì)各種資源管理的集合

      線程thread:操作系統(tǒng)最小的調(diào)度單位,是一串指令的集合

      進(jìn)程 要操作cpu,必須先創(chuàng)建一個(gè)線程

      進(jìn)程與線程區(qū)別:線程共享,進(jìn)程獨(dú)立

      線程共享內(nèi)存空間,進(jìn)程內(nèi)存是獨(dú)立的

      同一個(gè)進(jìn)程之間的線程可以直接通信,兩個(gè)進(jìn)程必須通過中間代理才能通信,創(chuàng)建新線程很簡單,創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一次克隆

      一個(gè)線程可以控制和操作統(tǒng)一進(jìn)程里的其他線程,進(jìn)程只能操作子進(jìn)程

      GIL:Global Interpreter Lock

      直接調(diào)用

      import threading import time def run(n): print("task:", n) time.sleep(2) t1 = threading.Thread(target=run, args=("t1",)) t2 = threading.Thread(target=run, args=("t2",)) t3 = threading.Thread(target=run, args=("t3",)) t1.start() t2.start() t3.start() """ task: t1 task: t2 task: t3 """

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      繼承式調(diào)用

      import threading import time class MyThread(threading.Thread): def __init__(self, n, sleep_time): super(MyThread, self).__init__() self.n = n self.sleep_time = sleep_time def run(self): # 需要運(yùn)行的代碼 print("task:", self.n) time.sleep(self.sleep_time) print("task done", self.n, threading.current_thread(), threading.active_count()) t1 = MyThread("t1", 2) t2 = MyThread("t2", 3) t3 = MyThread("t3", 4) t1.start() t2.start() t3.start() # 等待線程執(zhí)行完畢繼續(xù)主線程,阻塞 t1.join() # wait() t2.join() t3.join() print("...main...", threading.current_thread(), threading.active_count()) # 主線程 """ task: t1 task: t2 task: t3 task done t1 4 task done t2 3 task done t3 2 ...main... <_MainThread(MainThread, started 2948)> 1 """

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      多線程調(diào)用

      # 主線程與子線程是并行的 import threading import time def run(n): print("task:", n) time.sleep(2) print("task done", n) start_time = time.time() threads = [] # 保存線程列表 for i in range(5): t = threading.Thread(target=run, args=("t%s"%i,)) t.start() threads.append(t) # 將所有線程阻塞 for t in threads: t.join() end_time = time.time() print("time:", end_time - start_time) """ task: t0 task: t1 task: t2 task: t3 task: t4 task done t4 task done t2 task done t3 task done t1 task done t0 time: 2.0103650093078613 """

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      守護(hù)線程

      import threading import time def run(n): print("task:", n) time.sleep(2) print("task done", n) start_time = time.time() threads = [] # 保存線程列表 for i in range(5): t = threading.Thread(target=run, args=("t%s"%i,)) t.setDaemon(True) # 設(shè)置為守護(hù)線程,主線程停止隨之停止 t.start() threads.append(t) time.sleep(2) # 等待部分線程執(zhí)行完畢 end_time = time.time() print("time:", end_time - start_time) """ task: t0 task: t1 task: t2 task: t3 task: t4 task done t2 task done t4 task done t3 task done t1 task done t0 time: 2.0087130069732666 """

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      互斥鎖

      import threading import time num = 0 lock = threading.Lock() # 實(shí)例化互斥鎖 def run(n): global num lock.acquire() # 申請(qǐng)鎖 time.sleep(2) num += 1 lock.release() # 釋放鎖 print(num) start_time = time.time() threads = [] # 保存線程列表 for i in range(5): t = threading.Thread(target=run, args=("t%s"%i,)) t.start() threads.append(t) for thread in threads: thread.join() # 等待部分線程執(zhí)行完畢 end_time = time.time() print("time:", end_time - start_time) print("num:", num) """ 1 2 3 4 5 time: 10.027688980102539 num: 5 """

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      遞歸鎖

      import threading import time num = 0 lock = threading.RLock() # 實(shí)例化遞歸鎖,此處用普通互斥鎖會(huì)卡死 def run1(): print("run1_start") lock.acquire() # 第二級(jí)鎖 print("run1") lock.release() def run2(): lock.acquire() # 第二級(jí)鎖 print("run2") lock.release() def run(): lock.acquire() # 第一級(jí)鎖 print("run1_begin") run1() print("run2_begin") run2() print("run_end") lock.release() # 釋放鎖 start_time = time.time() t = threading.Thread(target=run) t.start() # t.join() # 等待全部線程執(zhí)行完畢 while threading.active_count() > 1: print(threading.current_thread()) end_time = time.time() print("time:", end_time - start_time) """ run1_begin <_MainThread(MainThread, started 22552)> <_MainThread(MainThread, started 22552)> <_MainThread(MainThread, started 22552)> run1_start <_MainThread(MainThread, started 22552)> run1 run2_begin run2 run_end time: 0.0 """

      1

      2

      3

      4

      5

      6

      7

      8

      Python編程:threading多線程

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      信號(hào)鎖

      import threading import time semaphore = threading.BoundedSemaphore(5) # 設(shè)置信號(hào)量,最多允許5個(gè)線程同時(shí)運(yùn)行 def run(n): semaphore.acquire() # 信號(hào)鎖 time.sleep(1) print("run", n) semaphore.release() start_time = time.time() for i in range(10): t = threading.Thread(target=run, args=(i,)) t.start() # 等待全部線程執(zhí)行完畢 while threading.active_count() != 1: pass end_time = time.time() print("time:", end_time - start_time) """ run 1 run 2 run 4 run 0 run 3 run 5 run 7 run 8 run 9 run 6 time: 2.061771869659424 """

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      Python 任務(wù)調(diào)度 多線程

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:縱向聯(lián)邦學(xué)習(xí)場(chǎng)景下的邏輯回歸(LR)
      下一篇:Java---設(shè)計(jì)模塊(單例的變形)(多例)
      相關(guān)文章
      亚洲六月丁香婷婷综合| 亚洲国产精品国自产拍AV| 亚洲无人区一区二区三区| 国产精品久久亚洲一区二区| 亚洲精品无码永久在线观看男男| 亚洲AV无码一区二区三区牛牛| 亚洲中文字幕无码av在线| 亚洲国产成人无码av在线播放 | 亚洲精品免费在线观看| 亚洲色偷偷偷鲁综合| 亚洲中文字幕无码一区二区三区| 亚洲日韩在线观看| 久久久精品国产亚洲成人满18免费网站 | 亚洲综合无码一区二区痴汉| 中文字幕在线日亚洲9| 亚洲一日韩欧美中文字幕在线| 亚洲日韩看片无码电影| 亚洲欧洲专线一区| 亚洲AV色无码乱码在线观看| 国产亚洲一卡2卡3卡4卡新区 | 亚洲邪恶天堂影院在线观看| 亚洲av鲁丝一区二区三区| 亚洲国产一区二区三区青草影视| 亚洲视频.com| 91亚洲导航深夜福利| 亚洲另类自拍丝袜第1页| 亚洲中文字幕久在线| 亚洲夂夂婷婷色拍WW47| 亚洲av乱码中文一区二区三区| 国产精品亚洲а∨无码播放不卡| 亚洲人成色77777在线观看大| 久久久亚洲精品蜜桃臀 | 中国china体内裑精亚洲日本| 亚洲免费网站观看视频| 日韩亚洲国产二区| 久久久久国产亚洲AV麻豆| 亚洲av午夜福利精品一区人妖| 日本久久久久亚洲中字幕| 亚洲国产成AV人天堂无码| 亚洲色无码专区一区| 自拍偷自拍亚洲精品播放|