python多任務編程_python線程的多任務編程

多任務

多任務介紹

對于人來說,一邊聽歌,一邊跳舞就是多任務。

對于電腦,簡單的說,同一時間執行多個程序處理數據叫做多任務

多任務理解

單核CPU

9e2ae74f1a352a4303aa86f7e7e3be2f.png

單核cpu在處理多任務的時候是根據時間片輪轉的方式進行的,比如執行QQ1us,然后切換微信執行1us,最后是執行釘釘1us,如此循環。因為cpu的切換速度過快,導致我們認為三個軟件是同時執行的

多核cpu

d3ad2ef5ae0d3b33361bb4fec82b6051.png

并發:當cpu不能同時執行當前所有任務時,就會循環執行,是假的多任務

并行:當cpu可以同時執行當前所有任務時,是真的多任務

多任務的實現方式

實現多任務有三種方式:

線程

進程

協程

線程

線程介紹

線程是指在一個單獨進程中,對于CPU和內存而言的多個工作單位,所有線程在進程中的資源都是共享的,包括全局數據、執行代碼等。

線程的使用

先介紹三個方法

setDaemon(True): 主線程A中,創建了子線程B,并且在主線程A中調用了B.setDaemon(),這個的意思是,把主線程A設置為守護線程,這時候,要是主線程A執行結束了,就不管子線程B是否完成,一并和主線程A退出.

join(): 主線程A中,創建了子線程B,并且在主線程A中調用了B.join(),那么,主線程A會在調用的地方等待,直到子線程B完成操作后,才可以接著往下執行

enumerate(): 查看線程數量

使用

代碼示例import threading

import datetime

def A():

print('函數A')

print(datetime.datetime.now())

def B():

print('函數B')

print(datetime.datetime.now())

if __name__ == '__main__':

# 指定線程到A()和B()函數里執行

t1 = threading.Thread(target=A)

t2 = threading.Thread(target=B)

# 執行線程

t1.start()

t2.start()

print('--end--')

從輸出結果可以知道,兩個線程是在同一時間一起執行的。不過因為搶占式的特點,最后一條語句print('--end--')有時會在子線程的前面執行。

join()方法的使用

如果我們想讓print('--end--')在最后執行,可以用到join()方法,當子線程結束后,主線程才會結束。

join方法的使用,代碼示例

import threading

import datetime

def A():

print('函數A')

print(datetime.datetime.now())

def B():

print('函數B')

print(datetime.datetime.now())

if __name__ == '__main__':

# 指定線程到A()和B()函數里執行

t1 = threading.Thread(target=A)

t2 = threading.Thread(target=B)

# 執行線程

t1.start()

t2.start()

t1.join()

t2.join()

print('--end--')

setDaemon()方法的使用

如果不想讓主線程等待子線程完成后才結束,可以使用setDaemon

代碼示例import threading

import time

def A():

for i in range(3):

print("A")

time.sleep(1)

if __name__ == '__main__':

t1 = threading.Thread(target=A)

t1.setDaemon(True) # 要放在線程開始之前

t1.start()

enumerate()的使用,查看線程數量

代碼示例import threading

import datetime

def A():

print('函數A')

print(datetime.datetime.now())

def B():

print('函數B')

print(datetime.datetime.now())

if __name__ == '__main__':

# 創建兩個主線程,指定線程到A()和B()函數里執行

t1 = threading.Thread(target=A)

t2 = threading.Thread(target=B)

# 執行線程

t1.start()

t2.start()

print(threading.enumerate())

print('--end--')

子線程的創建與執行

當我們調用start()方法時,子線程才會被創建,并且執行

繼承Thread類創建線程

我們可以通過修改Thread類的run()方法里的代碼,來完成重寫run()方法

代碼示例import threading

class T(threading.Thread):

def run(self):

self.a()

def a(self):

for i in range(3):

print('a')

if __name__ == '__main__':

t1 = T()

t1.start() # 當調用start()方法時,會主動調用run()方法

當我們調用start()方法時,會主動調用run()方法

多線程共享全局變量

代碼示例import threading

def a():

global num

num += 1

print(f'a:{num}')

def b():

print(f'b:{num}')

if __name__ == '__main__':

num = 10

print(num)

t1 = threading.Thread(target=a)

t2 = threading.Thread(target=b)

t1.start()

t2.start()

print(num)

線程的傳參

當用線程去函數里執行代碼時,我們可以看到函數后邊是沒有括號()的,所以涉及到傳參的時候我們該怎么解決這個問題?

解決方法

我們可以使用args參數進行傳參,參數為元組

當我們想要傳入字典時,可以使用kwargs進行傳入

代碼示例import threading

def a(x):

print(x)

def b(**kwargs):

print(kwargs)

if __name__ == '__main__':

num = 1

# 使用args參數進行傳參

t1 = threading.Thread(target=a, args=(num,))

# 使用kwargs參數進行傳入字典

t2 = threading.Thread(target=b, kwargs={"A": 1})

t1.start()

t2.start()

線程的資源搶占

代碼示例import threading

def a(x):

global num

for i in range(x):

num += 1

print(f'a: {num}')

def b(x):

global num

for i in range(x):

num += 1

print(f'b: {num}')

if __name__ == '__main__':

num = 100

t1 = threading.Thread(target=a, args=(1000000, ))

t2 = threading.Thread(target=b, args=(1000000, ))

t1.start()

t2.start()

print(num)

運行結果

382b3d51cd3ac994fe51a14123e64e89.png

正常的結果應該是2000100,但是因為資源搶占導致數據不正確,使用鎖就可以避免這個問題,下篇博客我會細講怎么解決這個問題。

最后,有喜歡博主寫的內容的伙伴可以點贊收藏加關注哦!

本文地址:https://blog.csdn.net/weixin_44604586/article/details/107091271

如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277554.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

列舉python的5個數據類型_python公開課|新公布的5個python核心數據類型,這些細節你難道還不不知道嗎...

【摘要】在這個科學技術高速發展的時代,越來越多的人都開始選擇學習編程軟件,那么首先被大家選擇的編程軟件就是python,也用在各行各業之中,并被大家所熟知,所以也有越來越多的python學習者關注python就業方向問題&…

selenium3 + python - page_source頁面源碼

前言: 有時候通過元素的屬性的查找頁面上的某個元素,可能不太好找,這時候可以從源碼中爬出想要的信息。selenium的page_source方法可以獲取到頁面源碼。 本次以博客園為例,先爬取頁面源碼,通過re正則表達式爬取出url&a…

簡單分析Guava中RateLimiter中的令牌桶算法的實現

為什么80%的碼農都做不了架構師?>>> 令牌桶算法是網絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目&am…

gcc oracle mysql_Linux下C語言訪問Oracle數據庫Demo

前提條件1. Linux環境已經存在,安裝好了Oracle本demo 運行環境本地環境 RedHat LINUX AS 4 ,ORACLE 10G本地數據庫sid orcl,ip:127.0.0.1,用戶名:kingbi,密碼:kingbi,表dsd_test. 顯示表dsd_test 的所有記錄.步驟:(1) 創建表 …

煉數成金數據分析課程---16、機器學習中的分類算法(交叉內容,后面要重點看)...

煉數成金數據分析課程---16、機器學習中的分類算法(交叉內容,后面要重點看) 一、總結 一句話總結: 大綱實例快速學習法 主要講解常用分類算法(如Knn、決策樹、貝葉斯分類器等)的原理及python代碼實現 1、什么是分類? 分…

NFS配置詳解

1、NFS服務介紹1.1 什么是NFS?NFS是Network File System的縮寫。中文意思是網絡文件系統。它的主要功能是通過網絡(一般是局域網)讓不同的主機系統之間可以共享文件或者目錄。NFS客戶端(一般為應用服務器,例如web&…

idea用法

更新gradle的依賴后,刷新項目引入jar包的方法: view--Tool Buttons 在右側 Gradle 點刷新 轉載于:https://www.cnblogs.com/z360519549/p/10994897.html

linux備份mysql需要暫停服務嗎_【MySQL運維】線上MySQL數據庫停服遷移流程

一、數據備份與恢復階段,選在凌晨1點進行操作,暫停服務進行備份(允許停服2個小時)1、首先停止Nginx服務,并且修改數據庫用戶密碼,防止還有新的連接進來2、殺掉某個用戶所有進程for i in mysql -udba -pPASSWORD -ssse "show …

免費下載!5本阿里技術好書,帶你看更大的世界

共享、開源是互聯網技術發展的重要精神。在過去,25000多萬名阿里工程師,撰寫了一系列精品技術叢書,從算法、研發到職業人生隨筆,應有盡有。目前該系列叢書已全部開放下載,供技術人免費閱讀。 今天小編整理了其中的五本…

python3安裝mysqlclient_Python3 安裝mysqlclient錯誤處理(MAC版)

在使用django的時候需要安裝mysqlclient庫,很多時候會出現以下報錯:running installrunning bdist_eggrunning egg_infowriting mysqlclient.egg-info/PKG-INFOwriting dependency_links to mysqlclient.egg-info/dependency_links.txtwriting top-level names to mysqlclient.…

React綁定事件處理函數this的幾種方法

在以類繼承的方式定義的組件中,為了能方便地調用當前組件的其他成員方法或屬性(如:this.state),通常需要將事件處理函數運行時的 this 指向當前組件實例。 綁定事件處理函數this的幾種方法: 第一種方法&…

烏班圖系統16.04安裝

本例jiyu基于Ubuntu16.04 64位版本為例進行安裝,安裝的方式有多種,本文使用光盤進行安裝安裝前應準備好,將Ubuntu的鏡像文件刻成光盤,然后將光盤放入光驅,并設置服務器從光盤啟動,開機到如下界面:按Enter鍵到下一步,如…

python做游戲用什么軟件_用Python自制谷歌小游戲

谷歌流量器中有個很有名的彩蛋:當你網絡出現問題時,就會出現一個“小恐龍游戲”。(如果想要直接進行游戲,可以在地址欄輸入:chrome://dino)今天我們就來給大家演示下,用Python來自己做一個仿制的“小恐龍游戲”&#x…

使用maven構建項目候,jar包錯誤的解決辦法

1、刪除架包,重新下載,右鍵項目點擊"run as"中的“maven clean”,然后再maven中找到Update Project 2、可以在代碼中,把鼠標放到報錯的架包上 點擊劃紅線部分,進行安裝 轉載于:https://www.cnblogs.com/qingqian/p/1099…

MySQL——通過EXPLAIN分析SQL的執行計劃

在MySQL中,我們可以通過EXPLAIN命令獲取MySQL如何執行SELECT語句的信息,包括在SELECT語句執行過程中表如何連接和連接的順序。下面分別對EXPLAIN命令結果的每一列進行說明:select_type:表示SELECT的類型,常見的取值有:…

python將argv作為參數_在jupyter / ipython notebook中將命令行參數傳遞給argv

經過大量的環顧后,我發現了非常繁瑣的自定義庫,但是用幾行代碼解決了它,我認為這些代碼很漂亮.我使用nbconvert最終得到一個html報告作為輸出,包含筆記本中的所有圖形和降價,但是通過最小的python包裝器接受命令行參數:python文件test_args.py(正常執行命令行參數)&…

模擬輸入(ADC-A0)

ESP8266具有內置的10位ADC,只有一個ADC通道(A0引腳),即只有一個ADC輸入引腳可讀取來自外部器件的模擬電壓 ESP8266上的ADC通道和芯片供電電壓復用,也就是說我們可以將其設置為測量系統電壓或者外部電壓 測量外部電壓: analogRead(…

SQL Server 連接超時案例一則

原文:SQL Server 連接超時案例一則上周六,一工廠系統管理員反饋一數據庫連接不上,SSMS連接數據庫報“連接超時時間已到。在嘗試使用預登錄握手確認時超過了此超時時間.......”, 如下截圖所示: 另外遠程連接也連接不上,系統管理員…

mysql 刪除5天前 備份_mysql自動備份刪除5天前的備份

1、查看磁盤空間情況:df -h2、創建備份目錄:上面我們使用命令看出/home下空間比較充足,所以可以考慮在/home保存備份文件;cd /homemkdir backupcd backup3、創建備份Shell腳本:注意把以下命令中的DatabaseName換為實際的數據庫名稱…

個人作業-Alpha項目測試

這個作業屬于哪個課程https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2作業地址https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340團隊名稱腦闊疼https://www.cnblogs.com/chaserFF/p/10994338.html這個作業的目標完成班級項目互評…