python併發程式設計之多執行緒

2022-05-29 03:09:18 字數 4800 閱讀 5580

程序包含了執行該程式所需要所有資源 , 程序是乙個資源單位 , 執行緒是cpu的最小執行單位

每乙個程序一旦被建立 , 就預設開啟了一條執行緒 , 稱之為主線程

使用執行緒可以提高程式效率

為何不用多程序提高效率: 是因為程序對作業系統的資源耗費非常高

執行緒共享建立它的程序的位址空間 ; 程序有自己的位址空間。

執行緒可以直接訪問其程序的資料段;程序擁有自己父程序資料段的副本。

執行緒可以直接與其程序的其他執行緒通訊;程序必須使用程序間通訊來與兄弟程序通訊。

新執行緒很容易建立;新流程需要複製父流程。執行緒可以對同一程序的執行緒進行相當大的控制;程序只能控制子程序。對主線程的更改(取消,優先順序更改等)可能會影響程序的其他執行緒的行為;對父程序的更改不會影響子程序。

建立執行緒與建立程序的方式幾乎一樣 , 但是建立子程序會將父程序的資源複製執行一遍 , 所以必須在__main__下執行 , 而建立執行緒則不一樣 , 執行緒間共享程序資源,所以不需要複製執行父執行緒**,所以可以不加__main__

一 . 建立執行緒的兩種方式

呼叫型別

from threading import

thread​​

deftask():

print('

thread running...')

​​if__name__ == '

__main__':

t = thread(target=task)

t.start()

print('

主線程')​

#執行結果

#thread running... (子執行緒比主線程執行速度更快)

#主線程

繼承型別

from threading import

thread​​

class

sayhi(thread):

def__init__

(self,name):

super().

__init__

() self.name=name

defrun(self):

print('

%s say hello

' %self.name)​​

if__name__ == '

__main__':

t = sayhi('

jason')

t.start()

print('

主線程'

)

#執行結果

#jason say hello

#主線程

二 . 執行緒的常用方法

thread例項化物件的方法:

#1.isalive(): 判斷執行緒是否還存在(未終止)

#2.getname(): 返回執行緒名

#3.setname(): 設定執行緒名

​threading模組下提供的方法

#threading.currentthread(): 返回當前的執行緒變數

#threading.enumerate(): 返回乙個正在執行的執行緒列表

#threading.activecount(): 返回當前執行的執行緒數量

#len(threading.activecount()): 與上乙個方法返回相同值

三 . 在乙個程序下開啟多個執行緒與在乙個程序下開啟多個子程序的區別

開啟速度 : 開啟執行緒》開啟程序(所以程式效率會大大提高)

id :

空間資源:

from threading import

thread

import

time

​def

task1():

print('

sub thread is running...')

time.sleep(0.5)

print('

sub thread end...')

deftask2():

time.sleep(0.1)

print('

task2 is run...')

​t1 = thread(target=task1)

t2 = thread(target=task2)

​t1.setdaemon(true)

#將t1設定為守護執行緒, 必須在start之前設定

​t1.start()

t2.strat()​#

執行結果

#sub thread run...

#task2 is run...

​​

import

time

from threading import

thread,lock

​lock =lock() #

例項化鎖物件

​a = 100​

deftask():

lock.acquire()

#給執行緒上鎖

global a #

訪問全域性a

temp = a - 1 #

修改全域性a

time.sleep(0.01)

a =temp

lock.release()

#釋放鎖,執行緒執行完畢

​ts =

for i in range(100):

t = thread(target=task)

t.start()

​for t in ts: #

lock保證了多執行緒序列,同時主線程print(a)也在其中,但是我們想得到最終結果,所以用join人為設定順序

t.join()​​

print(a)

使用場景

from threading import

thread,semaphore

import

time

sem = semaphore(3) #

設定最大訪問程序數​​

deftask():

sem.acquire()

print('

你好啊'

) time.sleep(3)

sem.release()​​

for i in range(10):

t = thread(target=task)

​ t.start()

#執行結果太長, 就不列印了

#現象描述 : 就是3個一次列印

"""

用生產者消費者模型實現乙個顧客吃漢堡的功能

主要是生產者生產處漢堡放入佇列,然後消費者吃掉,

要判斷什麼時候顧客吃完了所有生產了的漢堡

"""from multiprocessing import

process, joinablequeue

import

time, random

​def

eat_hotdog(name, q):

while

true:

res =q.get()

print('

%s吃了%s

' %(name,res))

time.sleep(random.randint(1,2))

q.task_done()​​

defmake_hotdog(name, q):

for i in range(1,6):

time.sleep(random.randint(1,2))

print('

%s生產了第%s個熱狗

' %(name, i))

res = '

%s的%s個熱狗

' %(name,i)

q.put(res)​​

if__name__ == '

__main__':

q =joinablequeue()

#生產者

c1 = process(target=make_hotdog, args=('

a熱狗店

', q))

c1.start()

#生產者2

c2 = process(target=make_hotdog, args=('

b熱狗店

',q))

c2.start()

#消費者

p2 = process(target=eat_hotdog, args=('顧客'

,q))

p2.daemon = true #

佇列阻塞開啟,主程序執行完畢,守護程序死

p2.start()​​

#保證生產者全部完成

c1.join()

c2.join()​​

#保證佇列中的資料全部被處理了

'''join:阻止,直到佇列中的所有專案都已獲取並處理完畢。

​ 每當專案新增到佇列時,未完成任務的計數就會增加。

每當消費者呼叫task_done()以指示該專案已被檢

索並且其上的所有工作都已完成時,計數就會下降。

當未完成任務的數量降至零時,join()取消阻塞。

'''q.join()

#joinablequeue方法

python併發程式設計之多執行緒一

一,什麼是執行緒 執行緒也被稱為輕量程序電腦科學術語,指執行中的程式的排程單位。執行緒是程序中的實體,乙個程序可以擁有多個執行緒,乙個執行緒必須有乙個父程序。執行緒不擁有系統資源,只有執行必須的一些資料結構 它與父程序的其它執行緒共享該程序所擁有的全部資源。執行緒可以建立和撤消執行緒,從而實現程式的...

1 3併發程式設計之多執行緒通訊

多執行緒之間通訊,其實就是多個執行緒在操作同乙個資源,但是操作的動作不同。1.因為涉及到物件鎖,他們必須都放在synchronized中來使用.wait notify一定要在synchronized裡面進行使用。2.wait必須暫定當前正在執行的執行緒,並釋放資源鎖,讓其他執行緒可以有機會執行 3....

Python多執行緒程式設計之多執行緒加鎖

python語言本身是支援多執行緒的,不像php語言。下面的例子是多個執行緒做同一批任務,任務總是有task num個,每次執行緒做乙個任務 print 做完後繼續取任務,直到所有任務完成為止。1 coding utf 8 2import threading 34 start task 0 5 ta...