python 多線程并發_尋找python大神!!!python如何多線程并發?

不是大神。嘗試回答一下。

首先解釋下什么叫做線程,什么叫做進程,在解釋這兩個概念前,我們還需要明白什么叫做GIL全局解釋器鎖。GIL 全局解釋器鎖: GIL(全局解釋器鎖,GIL 只有cpython有):在同一個時刻,只能有一個線程在一個cpu上執行字節碼,沒法像c和Java一樣將多個線程映射到多個CPU上執行,但是GIL會根據執行的字節碼行數(為了讓各個線程能夠平均利用CPU時間,python會計算當前已執行的微代碼數量,達到一定閾值后就強制釋放GIL)和時間片以及遇到IO操作的時候主動釋放鎖,讓其他字節碼執行。說白了GIL就是偽多線程,一個線程運行其他線程阻塞,使你的多線程代碼不是同時執行,而是交替執行。

python的多線程:由于GIL的原因,一個CPU同一個時刻只能執行一個線程,但是當遇到IO操作或者運行一定的代碼量的時候就會釋放全局解釋器鎖,執行另外一個線程。多線程能夠有效提升I/O阻塞型程序的效率;與進程相比,占用的系統資源少;線程間能夠共享資源,方便進行通信。python的多線程通過threading實現。

python的多進程:進程幾乎可以完成線程能夠完成的任何事情。與之不同的是,一個進程里面,包含一個主線程,還可以生成很多子線程。如果有需要的話,可以將它們組成多線程。多進程能夠.更好地利用多核處理器;.在處理CPU密集型任務時比多線程要好;可以通過多進程來避免全局解釋器鎖(GIL)的局限;崩潰的進程不會導致整個程序的崩潰。python中的多進程主要通過multiprocessing模塊實現。

threading實現多線程

python中提供兩個標準庫thread和threading用于對線程的支持,python3中已放棄對前者的支持,后者是一種更高層次封裝的線程庫,接下來均threading為例實現多線程。

1.創建線程

python中有兩種方式實現線程:

(1) 實例化一個threading.Thread的對象,并傳入一個初始化函數對象(initial function )作為線程執行的入口;

import threading

import time

def tstart(arg):

time.sleep(0.5)

print("%s running...." % arg)

if __name__ == '__main__':

t1 = threading.Thread(target=tstart, args=('This is thread 1',))

t2 = threading.Thread(target=tstart, args=('This is thread 2',))

t1.start()

t2.start()

t1.join()

t2.join()

print("This is main function")

(2) 繼承threading.Thread,并重寫run函數;

import threading

import time

class CustomThread(threading.Thread):

def __init__(self, thread_name):

# step 1: call base __init__ function

super(CustomThread, self).__init__(name=thread_name)

self._tname = thread_name

def run(self):

# step 2: overide run function

time.sleep(0.5)

print("This is %s running...." % self._tname)

if __name__ == "__main__":

t1 = CustomThread("thread 1")

t2 = CustomThread("thread 2")

t1.start()

t2.start()

t1.join()

t2.join()

print("This is main function")

上面兩種方法本質上都是直接或者間接使用threading.Thread類,實例化后,threading.Thread的主要方法有:start():創建線程后通過start啟動線程,等待CPU調度,為run函數執行做準備; run():線程開始執行的入口函數,函數體中會調用用戶編寫的target函數,或者執行被重載的run函數; (start() 方法是啟動一個子線程,線程名就是我們定義的name;run() 方法并不啟動一個新線程,就是在主線程中調用了一個普通函數而已。通過Thread類的start方法,可以啟動該線程,交給python虛擬機進行調度,當該線程獲得執行的機會時,就會調用run方法執行線程。) join([timeout]):阻塞掛起調用該函數的線程,直到被調用線程執行完成或超時。通常會在主線程中調用該方法,等待其他線程執行完成。 name、getName()&setName():線程名稱相關的操作; ident:整數類型的線程標識符,線程開始執行前(調用start之前)為None; isAlive()、is_alive():start函數執行之后到run函數執行完之前都為True; daemon、isDaemon()&setDaemon():守護線程相關;

2.執行多線程

前面在解釋start()和run()方法時,提到了主線程和子線程,主線程:一個進程中至少有一個線程,并作為程序的入口,這個線程就是主線程(從一開始的代碼執行到最后的打印出執行時間為主線程) 子線程:一個進程至少有一個主線程,其它線程稱為子線程; 在主線程中創建若線程之后,他們之間沒有任何協作和同步,除主線程之外每個線程都是從start()開始被執行,直到執行完畢。

上面的例子中可以發現一共有3個線程,1個主線程和2個子線程,如何定義子線程的?其實在代碼中就發現了,使用t1 = threading.Thread(target=tstart)即可生成一個子線程,然后使用t1.start()即可啟動這個子線程,這樣的話t1.jion()是不是就多余呢?其實不然,使用t1.jion()的作用就是:等待子線程執行完畢后再執行主線程,如果不加上t1.jion()的話,子線程任然執行,但是子線程再等待的時候(io操作的時候),釋放出資源,這個時候主線程拿到資源運行主線程的任務,然后再等待子線程運行結束,最后退出主程序。

所以t1.jion()放到位置很重要:

t1.start()

t1.join()

t2.start()

t2.join()

如果這樣放的話,就是先執行線程1然后等待線程1執行完畢,然后執行線程2等待線程2執行完畢。

t1.start()

t2.start()

t1.join()

t2.join()

這樣的話就不一樣,會等到線程1與線程2執行完畢后再執行主線程。

還有很多其他的線程相關的知識點,比如線程之間的優先級、通信等等。下面鏈接中的這位大神總結的非常全面,可以參考:https://blog.csdn.net/lzy98/article/details/88819425

查看我的更多相關回答:溪亭日暮:匯編 | 我的AI 技術回答?zhuanlan.zhihu.comv2-dae49df45d39cff27d4ce9b55ae2ae0c_180x120.jpg

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

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

相關文章

Nginx/Apache發大招

導讀網站程序的上傳目錄通常是不需要PHP執行解釋權限,通過限制目錄的PHP執行權限可以提網站的安全性,減少被攻擊的機率。下面和大家一起分享下如何在Apache和Nginx禁止上傳目錄里PHP的執行權限。 Apache下禁止指定目錄運行PHP腳本在虛擬主機配置文件中增…

第二輪沖刺-Runner站立會議08

今天完成的內容:簡單的做了一下主界面的美化和日歷界面的美化 遇到的問題:美化按鈕還不能自己自定義按鈕 如何解決:暫無思路 明天將要進行的內容:調試bug 轉載于:https://www.cnblogs.com/Againzg/p/5544301.html

STM32串口通信中使用printf發送數據配置方法 開發環境 Keil

STM32串口通信中使用printf發送數據配置方法(開發環境 Keil RVMDK) 已有 12456 次閱讀2011-6-29 23:29 | 在STM32串口通信程序中使用printf發送數據,非常的方便。可在剛開始使用的時候總是遇到問題,常見的是硬件訪真時無法進入main主函數,其實…

dmp文件查看表空間_innoDb文件

一.文件總體概述InnoDb文件主要有以下文件1. 參數文件:啟動需要的各種參數作2. 日志文件:記錄mysql實例某種條件做出的響應而寫入的文件,如錯誤日志、二進制日志、慢查詢日志、查詢日志等3. Socket文件:連接需要的文件…

論文筆記之:Deep Attention Recurrent Q-Network

Deep Attention Recurrent Q-Network 5vision groups 摘要:本文將 DQN 引入了 Attention 機制,使得學習更具有方向性和指導性。(前段時間做一個工作打算就這么干,誰想到,這么快就被這幾個孩子給實現了,自愧…

Codeforces Round #354 (Div. 2)

貪心 A Nicholas and Permutation #include <bits/stdc.h>typedef long long ll; const int N 1e5 5; int a[105]; int pos[105];int main() {int n;scanf ("%d", &n);for (int i1; i<n; i) {scanf ("%d", ai);pos[a[i]] i;}int ans abs …

linux c程序中內核態與用戶態內存存儲問題

Unix/Linux的體系架構 如上圖所示&#xff0c;從宏觀上來看&#xff0c;Linux操作系統的體系架構分為用戶態和內核態&#xff08;或者用戶空間和內核&#xff09;。內核從本質上看是一種軟件——控制計算機的硬件資源&#xff0c;并提供上層應用程序運行的環境。用戶態即上層應…

線程自動退出_C++基礎 多線程筆記(一)

join & detachjoin和detach為最基本的用法&#xff0c;join可以使主線程&#xff08;main函數&#xff09;等待子線程&#xff08;自定義的function_1函數&#xff09;完成后再退出程序&#xff0c;而detach可以使子線程與主線程毫無關聯的獨立運行&#xff0c;當主線程執行…

WEB在線預覽PDF

這是我在博客園發表的第一篇文章。以后會陸續把在線預覽其他格式文檔的解決方案發表出來。 解決思路&#xff1a;把pdf轉換成html顯示。 在線預覽pdf我暫時了解3種解決方案&#xff0c;歡迎大家補充。 方案一&#xff1a; 利用pdf2html軟件將PDF轉換成HTML。 用法: PDF2HTML [選…

[算法]判斷一個數是不是2的N次方

如果一個數是2^n&#xff0c;說明這個二進制里面只有一個1。除了1. a (10000)b a-1 (01111)b a&(a-1) 0。 如果一個數不是2^n&#xff0c; 說明它的二進制里含有多一個1。 a (1xxx100)b a-1(1xxx011)b 那么 a&(a-1)就是 (1xxx000)b&#xff0c; 而不會為0。 所以可…

VMware Ubuntu 全屏問題解決

在終端中輸入&#xff1a; sudo apt install open-vm* 回車 自動解決

數組拼接時中間怎么加入空格_【題解二維數組】1123:圖像相似度

1123&#xff1a;圖像相似度時間限制: 1000 ms 內存限制: 65536 KB【題目描述】給出兩幅相同大小的黑白圖像(用0-1矩陣)表示&#xff0c;求它們的相似度。說明&#xff1a;若兩幅圖像在相同位置上的像素點顏色相同&#xff0c;則稱它們在該位置具有相同的像素點。兩幅圖像的…

(舊)子數涵數·C語言——條件語句

首先&#xff0c;我們講一下理論知識&#xff0c;在編程中有三種結構&#xff0c;分別是順序結構、條件結構、循環結構&#xff0c;如果用流程圖來表示的話就是&#xff1a; 那么在C語言中&#xff0c;如何靈活運用這三種結構呢&#xff1f;這就需要用到控制語句了。 而條件語句…

apache.commons.lang.StringUtils 使用心得

apache.commons.lang.StringUtils 使用心得 轉載于:https://www.cnblogs.com/qinglizlp/p/5549687.html

python哪個版本支持xp_windows支持哪個版本的python

Windows操作系統支持Python的Python2版本和Python3版本&#xff0c;下載安裝時要根據windows的操作系統來選擇對應的Python安裝包&#xff0c;否則將不能安裝成功。 Python是跨平臺的&#xff0c;免費開源的一門計算機編程語言。是一種面向對象的動態類型語言&#xff0c;最初被…

Ubuntu 鍵盤錯位解決 更改鍵盤布局

原因是鍵盤布局不能適應鍵盤 解絕方法&#xff1a;更改鍵盤布局 一般改為標準104鍵盤就行 在終端輸入 sudo dpkg-reconfigure keyboard-configuration 選擇 標準104鍵盤 然后一直回車就行

【No.1 Ionic】基礎環境配置

Node 安裝git clone https://github.com/nodejs/node cd node ./configure make sudo make install node -v npm -vnpm設置淘寶鏡像npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao.org/distIOS Simulatorsudo npm instal…

識別操作系統

使用p0f進行操作系統探測 p0f是一款被動探測工具&#xff0c;通過分析網絡數據包來判斷操作系統類型。目前最新版本為3.06b。同時p0f在網絡分析方面功能強大&#xff0c;可以用它來分析NAT、負載均衡、應用代理等。 p0f的命令參數很簡單&#xff0c;基本說明如下&#xff1a; l…

常用RGB顏色表

轉載于:https://www.cnblogs.com/Itwonderful/p/5550800.html

python中seek函數的用法_在Python中操作文件之seek()方法的使用教程

seek()方法在偏移設定該文件的當前位置。參數是可選的&#xff0c;默認為0&#xff0c;這意味著絕對的文件定位&#xff0c;它的值如果是1&#xff0c;這意味著尋求相對于當前位置&#xff0c;2表示相對于文件的末尾。 沒有返回值。需要注意的是&#xff0c;如果該文件被打開或…