開啟線程的兩種方式,


'''
目錄
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())有相同的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM