進程 process : 一個程序的執行實例 擁有字節獨立資源,數據和主進程
線程 thread : 同一進程可被並行激活的控制流,共享相同空間地址,數據結構
(注:存在Python GIL 全局解釋器鎖 全局而言,本質上一個線程執行)
爲了節約資源的使用, 在一個進程中往往存在多個線程,那如何實現多線程操作?
1.使用import Threading.thread()建立線程
import time
impoer threading
def worker(n):
print(f"函數開始執行於:{time.ctime()}")
print('當前線程的名字是: ', threading.current_thread().name) #獲取當前線程名稱
time.sleep(n)
print (f"函數結束於:{time.ctime()},前線程的名字是: '{threading.current_thread().name}")
def main():
print(f"主函數開始{time.ctime()}")
threads=[] #使之同時啓動
t1=threading.Thread(target=worker,args=(4,)) #traget參數,執行函數。args傳遞參數
threads.append(t1)
t2 = threading.Thread(target=worker, args=(2,))
threads.append(t2)
for t in threads:
t.start()
for t in threads:
t.join()
print(f"主函數結束於{time.ctime()}")
if __name__ == '__main__':
main()
2 通過派生類實用線程
import threading
import time
def worker(n):
print(f"函數開始執行於:{time.ctime()}")
print('當前線程的名字是: ', threading.current_thread().name)
time.sleep(n)
print (f"函數結束於:{time.ctime()},前線程的名字是: '{threading.current_thread().name}")
class MyThread(threading.Thread):
def __init__(self,func,args):
threading.Thread.__init__(self)
self.func = func
self.args = args
def run(self): #定義線程啓動函數,和下文對應star相呼應
self.func(*self.args)
def main():
print(f"主函數開始{time.ctime()}")
threads=[] #使之同時啓動
t1=MyThread(worker,args=(4,))
threads.append(t1)
t2 = MyThread(worker, args=(2,))
threads.append(t2)
for t in threads:
t.start()
for t in threads:
t.join()
print(f"主函數結束於{time.ctime()}")
if __name__ == '__main__':
main()
3 同步鎖 threading.Lock()
將多線程鎖住,使得信息流通不出現問題
eggs=[]
lock = threading.Lock() #鎖
def put_egg(n,lst):
lock.acquire() #鎖上
for i in range(1,n+1):
time.sleep(random.randint(0,2))
lst.append(i)
lock.release()
def main():
threads=[]
for i in range(3):
t=threading.Thread(target=put_egg,args=(5,eggs))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print(eggs)
if __name__ == '__main__':
main()