Python之併發程式設計(五)多執行緒

2022-09-15 17:48:12 字數 3721 閱讀 6765

多執行緒的概念介紹

threading模組介紹:threading模組和multiprocessing模式在使用層面,有甚大的相似性

開啟多執行緒的兩種方式

開啟程序的第一種方式:

#1.建立執行緒的開銷比建立程序的開銷小,因而建立執行緒的速度快

from multiprocessing import process

from threading import thread

import os

import time

def work():

print('<%s> is running'%os.getpid())

time.sleep(2)

print('<%s> is done'%os.getpid())

if __name__ == '__main__':

t=thread(target=work,)

# t= process(target=work,)

t.start()

print('主',os.getpid())

#開啟程序的第一種方式

開啟程序的第二種方式(用類):

from threading import thread

import time

class work(thread):

def __init__(self,name):

super().__init__()

self.name = name

def run(self):

# time.sleep(2)

print('%s say hell'%self.name)

if __name__ == '__main__':

t = work('egon')

t.start()

print('主')

#開啟執行緒的第二種方式(用類)

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

執行緒的開啟速度大於程序的開啟速度

from  multiprocessing import process

from threading import thread

import time

def work():

time.sleep(2)

print('hello')

if __name__ == '__main__':

t = thread(target=work)#如果等上幾秒,他會在開啟的過程中先列印主,如果不等會先列印hello

# t = process(target=work) #子程序會先列印主,

t.start()

print('主')

#執行緒的開啟速度大於程序的開啟速度

在同乙個程序下開多個程序和開多個執行緒的pid不同

# 2.----------

from multiprocessing import process

from threading import thread

import os

def work():

print('hello',os.getpid())

if __name__ == '__main__':

#在主程序下開啟多個執行緒,每個執行緒都跟主程序的pid一樣

t1= thread(target=work)

t2 = thread(target=work)

t1.start()

t2.start()

print('主線程pid',os.getpid())

#來多個程序,每個程序都有不同的pid

p1 = process(target=work)

p2 = process(target=work)

p1.start()

p2.start()

print('主程序pid', os.getpid())

#在同乙個程序下開多個程序和開多個執行緒的pid的不同

同一程序內的執行緒共享該程序的資料

from  threading import thread

from multiprocessing import process

import os

def work():

global n

n-=1

print(n) #所以被改成99了

n = 100

if __name__ == '__main__':

# p = process(target=work)

p = thread(target=work) #當開啟的是執行緒的時候,因為同一程序內的執行緒之間共享程序內的資料

#所以列印的n為99

p.start()

p.join()

print('主',n) #毫無疑問子程序p已經將自己的全域性的n改成了0,

# 但改的僅僅是它自己的,檢視父程序的n仍然為100

#同一程序內的執行緒共享該程序的資料

執行緒和程序的區別:

開啟程序的開銷非常大,比開啟執行緒的開銷大很多.

開啟執行緒的速度非常快.要快幾十倍到上百倍.

執行緒執行緒之間可以共享資料,程序與程序之間需借助佇列等方法實現通訊.

執行緒的一些方法

from threading import thread

from threading import currentthread

from threading import enumerate

from threading import activecount

import time

import os

def task():

time.sleep(2)

print('666')

if __name__ == '__main__':

t1 = thread(target=task,name='執行緒1')

t2 = thread(target=task,name='執行緒2')

t1.start()

t2.start()

print(t1.isalive()) # 判斷執行緒是否還在活動 返回布林值

print(t1.getname()) # 獲取執行緒名稱

t1.setname('gou') # 設定執行緒名稱

print(t1.name)

print(currentthread()) # 獲取當前執行緒

print(enumerate()) # 獲取當前程序下所有執行緒,並以列表形式返回

print(activecount()) # 獲取還在活動的執行緒數

print(f"==主線程")

# 結果:

true

執行緒1gou

<_mainthread(mainthread, started 11472)>

[<_mainthread(mainthread, started 11472)>, , ]

3==主線程12980

666666

join和守護程序

互斥鎖

python併發程式設計 多執行緒 執行緒理論

一 什麼是執行緒 在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程 執行緒顧名思義,就是一條流水線工作的過程 流水線的工作需要電源,電源就相當於cpu 而一條流水線必須屬於乙個車間,乙個車間的工作過程是乙個程序,車間負責把資源整合到一起,是乙個資源單位,而乙個車間內至少有一條流水線...

多執行緒併發程式設計

docker 可謂是開啟了容器化技術的新時代,現在無論大中小公司基本上都對容器化技術有不同程度的嘗試,或是已經進行了大量容器化的改造。伴隨著 kubernetes 和 cloud native 等技術和理念的普及,也大大增加了業務容器化需求。而這一切的推進,不可避免的技術之一便是構建容器映象。在本場...

多執行緒併發程式設計

程序是乙個執行的程式,程序裡面有多個執行緒,執行緒是程序中負責執行的程式的一執行單元,執行緒本身是依靠程式進行執行的,執行緒是程式中乙個順序控制流。執行緒分為單執行緒和多執行緒。多執行緒能更好利用cpu資源。以前單程序的,時間片切換 多執行緒實現方式 繼承thread,實現runnable。exec...