您好,登錄后才能下訂單哦!
Python中怎么搭建多線程環(huán)境,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
在Python的thread module所提供的接口中,一定不能少的肯定是創(chuàng)建線程的接口,倘若沒有這個接口,生活還有什么意義呢J?在上面的thread1.py中,我們正是通過其提供的start_new_thread創(chuàng)建了一個嶄新的線程。好,我們就進入這個start_new_ thread,看看Python是如何進行創(chuàng)世紀的工作的。
[threadmodule.c] static PyObject* thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { PyObject *func, *args, *keyw = NULL; struct bootstate *boot; long ident; PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3, &func, &args, &keyw); //[1]:創(chuàng)建bootstate結(jié)構(gòu) boot = PyMem_NEW(struct bootstate, 1); boot->interp = PyThreadState_GET()->interp; boot->funcfunc = func; boot->argsargs = args; boot->keywkeyw = keyw; //[2]:初始化多線程環(huán)境 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */ //[3]:創(chuàng)建線程 ident = PyThread_start_new_thread(t_bootstrap, (void*) boot); return PyInt_FromLong(ident); }
代碼清單15-1的[1]、[2]和[3]分別有如下含義:
[1] 創(chuàng)建并初始化bootstate結(jié)構(gòu)boot,在boot中,將保存關(guān)于線程的一切信息,如:線程過程,線程過程的參數(shù)等。
[2] 初始化Python多線程環(huán)境。
[3] 以boot為參數(shù),創(chuàng)建操作系統(tǒng)的原生線程。
在代碼清單15-1的[1]中,我們注意到boot->interp中保存了Python的PyInter- preterState對象,這個對象中攜帶了Python的module pool這樣的全局信息,Python中所有的thread都會共享這些全局信息。關(guān)于代碼清單15-1的[2]處所示的多線程環(huán)境的初始化動作,有一點需要特別說明,當Python啟動時,是并不支持多線程的。
換句話說,Python中支持多線程的數(shù)據(jù)結(jié)構(gòu)以及GIL都是沒有創(chuàng)建的,Python之所以有這種行為是因為大多數(shù)的Python程序都不需要多線程的支持。假如一個簡單地統(tǒng)計詞頻的Python腳本中居然出現(xiàn)了多線程,面對這樣的代碼,我們一定都會抓狂的J。
對多線程的支持并非是沒有代價的,最簡單的一點,如果激活多線程機制,而執(zhí)行的Python程序中并沒有多線程,那么在100條指令之后,Python虛擬機同樣會激活線程的調(diào)度。而如果不激活多線程,Python多線程環(huán)境虛擬機則不用做這些無用功。所以Python選擇了讓用戶激活多線程機制的策略。在Python虛擬機啟動時。
多線程機制并沒有被激活,它只支持單線程,一旦用戶調(diào)用thread.start_new_thread,明確指示Python虛擬機創(chuàng)建新的線程。Python就能意識到用戶需要多線程的支持,這個時候,Python多線程環(huán)境會自動建立多線程機制需要的數(shù)據(jù)結(jié)構(gòu)、環(huán)境以及那個至關(guān)重要的GIL。
看完上述內(nèi)容,你們掌握Python中怎么搭建多線程環(huán)境的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。