'''
目錄
1,開啟線程的兩種方式*****
2,線程和進程的區別*****
3,線程對象的其他方法和屬性
4,守護線程
5,互斥鎖
6,死鎖現象與遞過鎖
7,信號量
'''
#1 開啟線程的兩種方式
import time
from threading import Thread
def dask(name):
print('%s is running '%name)
time.sleep(1)
print('%s is done'%name)
t=Thread(target=dask,args=('egon',))
t.start()
print('主')
# 第二種
class Mythread(Thread):
def __init__(self,name):
super(Mythread, self).__init__()
self.name=name
def run(self):
print("%s is running "%self.name)
print('%s is done'%self.name)
t=Mythread('alex')
t.start()
print('主')
# --------------------進程VS線程VS區別--------------------
#1,線程的開啟速度快,線程執行完代碼不再存活
# 主線程執行完畢等所有非守護線程執行完畢才會死亡,因為主進程要回操作系統收資源,
# 如果子線程還沒結束就進行回收,那么子線程就找不到數據
from threading import Thread
from multiprocessing import Process
import time
def task(name):
print('%s is running '%name)
time.sleep(2)
print('%s is done '%name)
if __name__ == '__main__':
t=Thread(target=task,args=('子線程',))
t.start()
print('主 ')
#2.同一進程下的多個線程共享該進程內的數據,子線程可以修改該進程內的數據被其他子線程調用
#子進程修改全局變量修改的只是自己的,子進程無法修改父進程的資源,因為空間都是物理上的隔離
from threading import Thread
import time
x=100
def dask():
global x
x=88
print(x)
time.sleep(1)
#開啟多個子進程多個子進程的PID 都是不一樣的,開啟多個子線程,多個子線程和主線程的Pid都是一致的
t=Thread(target=dask)
t.start()
t.join() #會等子線程運行完畢才往下走
print('主',x)
#查看pid
from threading import Thread
import os,time
def task():
print(os.getpid())
t=Thread(target=task)
t.start()
print('主',os.getpid())
# ======================線程對象的其他方法和屬性==================#
#主進程等子進程是因為主進程要給子進程收屍
#進程必須等待其內部所有線程都隱形完畢才結束
from threading import current_thread,active_count,enumerate
import time
def task(name):
print('%s is running '%name)
time.sleep(2)
print('%s is done'%name)
t=Thread(target=task,args=('子線程',))
t.start()
print('主')
# ------------------------------------------
def task():
print('%s is running '%current_thread().name)
time.sleep(2)
print('%s is done'%current_thread().name)#查看當前進程的名字
print('走到這了')
t=Thread(target=task,name='xxx')
t.start()
t.join()
print(t.is_alive())#判斷進/線程是否存活
print(t.getName())#拿到線程對象的名字xxx
print(enumerate())
current_thread().setName('主線程')
print('主',current_thread().name)#拿到當前線程的名字
# Thread實例對象的方法
# isAlive(): 返回線程是否活動的。
# getName(): 返回線程名。
# setName(): 設置線程名。
# threading模塊提供的一些方法:
# threading.currentThread(): 返回當前的線程變量。
# threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啟動后、結束前,不包括啟動前和終止后的線程。
# threading.activeCount(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。