php和python的多线程,Python多线程以及线程锁简单理解(代码)
本篇文章給大家帶來的內容是關于Python多線程以及線程鎖簡單理解(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
多線程threading 模塊創建線程創建自己的線程類線程通信線程同步互斥方法線程鎖@需要了解!!!
多線程
什么是線程?
線程也是一種多任務的編程方法,可以利用計算機多核資源完成程序的并發運行。
線程又被稱為輕量級進程
線程的特征
線程是計算機多核分配的最小單位
一個進程可以包含多個線程
線程也是一個運行的過程,消耗計算機資源,多個線程共享進程的資源和空間
線程的創建刪除消耗的資源都遠遠比進程小
多個線程之間執行互不干擾
線程也有自己的特有屬性,比如指令集ID
threading 模塊創建線程
t=threading.Thread()
name:線程名稱,如果為空則為默認值,Tread-1,Tread-2,Tread-3
target:線程函數
args:元組,給線程函數按照位置傳參
kwargs:字典,給縣城函數按照鍵值傳參
功能:創建線程對象
參數
t.start():啟動線程,自動運行線程函數
t.join([timeout]):回收進程
t.is_alive():查看線程狀態
t.name():查看線程名稱
t.setName():設置線程名稱
t.daemon屬性:默認主線成退出不影響分支線程繼續執行,如果設置為True則分支線程隨著主線程一起退出
t.daemon = True
t.setDaemon(Ture)
設置方法#!/usr/bin/env python3
from threading import Thread
from time import sleep
import os
# 創建線程函數
def music():
sleep(2)
print("分支線程")
t = Thread(target = music)
# t.start() # ******************************
print("主線程結束---------")
'''沒有設置的打印結果
主線程結束---------
分支線程
'''
'''設置為True打印結果
主線程結束---------
'''
threading.currentThread:獲取當前線程對象
@此處代碼示意子線程共享同一個進程內的變量
#!/usr/bin/env python3
from threading import Thread
from time import sleep
import os
# 創建線程函數
def music():
global a
print("a=",a)
a = 10000
for i in range(5):
sleep(1)
print("1212")
a = 1
t = Thread(target = music)
t.start()
t.join()
print("主線程的a =",a)創建自己的線程類
考察點:類的使用,調用父類的__init__方法,函數*傳參和**傳參
from threading import Thread
import time
class MyThread(Thread):
name1 = 'MyThread-1'
def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'):
super().__init__()
self.name = name
self.target = target
self.args = args
self.kwargs = kwargs
def run(self):
self.target(*self.args,**self.kwargs)
def player(song,sec):
for i in range(2):
print("播放 %s:%s"%(song,time.ctime()))
time.sleep(sec)
t =MyThread(target = player, args = ('亮亮',2))
t.start()
t.join()
線程通信
通信方法:由于多個線程共享進程的內存空間,所以線程間通信可以使用全局變量完成
注意事項:線程間使用全局變量往往要同步互斥機制保證通信的安全
線程同步互斥方法
event
e = threading.Event():創建事件對象
e.wait([timeout]):設置狀態,如果已經設置,那么這個函數將阻塞,timeout為超時時間
e.set:將e變成設置狀態
e.clear:刪除設置狀態
import threading
from time import sleep
def fun1():
print("bar拜山頭")
global s
s = "天王蓋地虎"
def fun2():
sleep(4)
global s
print("我把限制解除了")
e.set() # 解除限制,釋放資源
def fun3():
e.wait() # 檢測限制
print("說出口令")
global s
if s == "天王蓋地虎":
print("寶塔鎮河妖,自己人")
else:
print("打死他")
s = "哈哈哈哈哈哈"
# 創建同步互斥對象
e = threading.Event()
# 創建新線程
f1 = threading.Thread(target = fun1)
f3 = threading.Thread(target = fun3)
f2 = threading.Thread(target = fun2)
# 開啟線程
f1.start()
f3.start()
f2.start()
#準備回收
f1.join()
f3.join()
f2.join()
線程鎖
lock = threading.Lock():創建鎖對象
lock.acquire():上鎖
lock.release():解鎖
也可以用過with來上鎖
1 with lock:
2 ...
3 ...
需要了解!!!
Python線程的GIL問題(全局解釋器):
python---->支持多線程---->同步互斥問題---->加鎖解決---->超級鎖(給解釋器加鎖)---->解釋器同一時刻只能解釋一個線程--->導致效率低下
后果:
一個解釋器同一時刻只能解釋執行一個線程,所以導致Python線程效率低下,但是當遇到IO阻塞時線程會主動讓出解釋器,因此Pyhton線程更加適合高延遲的IO程序并發
解決方案
盡量使用進程完成并發(和沒說一樣)
不適當用C解釋器 (用C# ,JAVA)
盡量使用多種方案組合的方式進行并發操作,線程用作高延遲IO
總結
以上是生活随笔為你收集整理的php和python的多线程,Python多线程以及线程锁简单理解(代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE REG文件相关资料
- 下一篇: php调用数据二行一组,PHPCMS v