Python线程、进程知识整理
一.python線程
Threading用于提供線程相關的操作,線程是應用程序中工作的最小單元。
1 #!/usr/bin/env python2 # -*- coding:utf-8 -*-3 import threading4 import time5 6 def show(arg):7 time.sleep(1)8 print 'thread'+str(arg)9 10 for i in range(10): 11 t = threading.Thread(target=show, args=(i,)) 12 t.start() 13 14 print 'main thread stop'上述代碼創建了10個“前臺”線程,然后控制器就交給了CPU,CPU根據指定算法進行調度,分片執行指令。
更多方法:
start 線程準備就緒,等待CPU調度
setName 為線程設置名稱
getName 獲取線程名稱
setDaemon 設置為后臺線程或前臺線程(默認)
如果是后臺線程,主線程執行過程中,后臺線程也在進行,主線程執行完畢后,后臺線程不論成功與否,均停止
如果是前臺線程,主線程執行過程中,前臺線程也在進行,主線程執行完畢后,等待前臺線程也執行完成后,程序停止
join 逐個執行每個線程,執行完畢后繼續往下執行,該方法使得多線程變得無意義
run 線程被cpu調度后自動執行線程對象的run方法
二.線程鎖(Lock、RLock)
由于線程之間是進行隨機調度,并且每個線程可能只執行n條執行之后,當多個線程同時修改同一條數據時可能會出現臟數據,所以,出現了線程鎖 - 同一時刻允許一個線程執行操作。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! '''1 #!/usr/bin/env python2 # -*- coding:utf-8 -*-3 import threading4 import time5 6 gl_num = 07 8 def show(arg):9 global gl_num 10 time.sleep(1) 11 gl_num +=1 12 print gl_num 13 14 for i in range(10): 15 t = threading.Thread(target=show, args=(i,)) 16 t.start() 17 18 print 'main thread stop' 19 20 未使用鎖
互斥鎖 同時只允許一個線程更改數據,而Semaphore是同時允許一定數量的線程更改數據 ,比如廁所有3個坑,那最多只允許3個人上廁所,后面的人只能等里面有人出來了才能再進去。
三.信號量(Semaphore)
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! '''1 import threading,time2 3 def run(n):4 semaphore.acquire()5 time.sleep(1)6 print("run the thread: %s" %n)7 semaphore.release()8 9 if __name__ == '__main__': 10 11 num= 0 12 semaphore = threading.BoundedSemaphore(5) #最多允許5個線程同時運行 13 for i in range(20): 14 t = threading.Thread(target=run,args=(i,)) 15 t.start()四.事件(event)
python線程的事件用于主線程控制其他線程的執行,事件主要提供了三個方法 set、wait、clear。
事件處理的機制:全局定義了一個“Flag”,如果“Flag”值為 False,那么當程序執行 event.wait 方法時就會阻塞,如果“Flag”值為True,那么event.wait 方法時便不再阻塞。
- clear:將“Flag”設置為False
- set:將“Flag”設置為True
五.條件(Condition)
使得線程等待,只有滿足某條件時,才釋放n個線程
六.Timer
七.python進程
八.進程數據共享
進程各自持有一份數據,默認無法共享數據
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! '''1 #!/usr/bin/env python2 #coding:utf-83 4 from multiprocessing import Process5 from multiprocessing import Manager6 7 import time8 9 li = [] 10 11 def foo(i): 12 li.append(i) 13 print 'say hi',li 14 15 for i in range(10): 16 p = Process(target=foo,args=(i,)) 17 p.start() 18 19 print 'ending',li 20 21 進程間默認無法數據共享 1 'c': ctypes.c_char, 'u': ctypes.c_wchar, 2 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, 3 'h': ctypes.c_short, 'H': ctypes.c_ushort, 4 'i': ctypes.c_int, 'I': ctypes.c_uint, 5 'l': ctypes.c_long, 'L': ctypes.c_ulong, 6 'f': ctypes.c_float, 'd': ctypes.c_double ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! ''' from multiprocessing import Process, Queuedef f(i,q):print(i,q.get())if __name__ == '__main__':q = Queue()q.put("h1")q.put("h2")q.put("h3")for i in range(10):p = Process(target=f, args=(i,q,))p.start()Code當創建進程時(非使用時),共享數據會被拿到子進程中,當進程中執行完畢后,再賦值給原值。
九.進程池
進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進進程,那么程序就會等待,直到進程池中有可用進程為止。
進程池中有兩個方法:
- apply
- apply_async
總結
以上是生活随笔為你收集整理的Python线程、进程知识整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 25个python相关的基础概念总结
- 下一篇: python中实现延时回调普通函数示例代