日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php和python的多线程,Python多线程以及线程锁简单理解(代码)

發布時間:2023/12/10 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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多线程以及线程锁简单理解(代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。