日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

深入理解Python 多線程

瀏覽:156日期:2022-07-21 09:06:51

Python里的多線程是假的多線程,不管有多少核,同一時間只能在一個核中進行操作!利用Python的多線程,只是利用CPU上下文切換的優(yōu)勢,看上去像是并發(fā),其實只是個單線程,所以說他是假的單線程。

那么什么時候用多線程呢?

首先要知道:

io操作不占用CPU 計算操作占CPU,像2+5=5

Python的多線程不適合CPU密集操作型的任務,適合io密集操作型的任務,例如:SocketServer

如果現(xiàn)在再有CPU密集操作型的任務,那該怎么辦呢?

首先說,多進程的進程之間是獨立的,然后注意了,python的線程用的是系統(tǒng)的原生線程,python的進程也是用系統(tǒng)的原生進程,那原生進程是由操作系統(tǒng)維護的,說白了python只是利用C原生代碼庫的接口?E嚓起了個進程,真正的進程管理還是由操作系統(tǒng)來完成的,那么操作系統(tǒng)本身有GIL全局解釋器鎖嗎?答案是沒有的,且兩個進程之間的數(shù)據(jù)是完全獨立的,不能互相訪問,所以不需要鎖的概念,所以不存在GIL概念,所以在這種情況下,每個進程至少會有一個線程,如果現(xiàn)在我的操作系統(tǒng)是八核的,我起八個進程,然后每個進程里面都有一個線程,那么就相當于八線程了,八個線程跑在八核上,那么就相當于利用多核了,那么問題就解決了!

唯一的壞處是八個線程之間的數(shù)據(jù)是不能共享的,獨立的!利用這種方法可以折中的解決多核運算的問題!

先看一段簡單的多進程的程序:

import multiprocessingimport timedef run(name): time.sleep(2) print(’hello’, name)if __name__ == ’__main__’: for i in range(10): p = multiprocessing.Process(target=run, args=(’bob%s’%i,)) p.start()

程序的執(zhí)行結(jié)果為:

hello bob0hello bob1hello bob3hello bob2hello bob5hello bob9hello bob7hello bob8hello bob4hello bob6

那么,如果我想取我的進程號,那該怎么取呢?

from multiprocessing import Processimport osdef info(title): print(title) print(’module name:’, __name__) print(’parent process:’, os.getppid()) # 父進程ID print(’process id:’, os.getpid()) # 自己進程的ID print('nn')def f(name): info(’033[31;1mfunction f033[0m’) print(’hello’, name)if __name__ == ’__main__’: info(’033[32;1mmain process line033[0m’) p = Process(target=f, args=(’bob’,)) p.start() p.join()

程序執(zhí)行的結(jié)果為:

main process linemodule name: __main__parent process: 5252process id: 6576

function fmodule name: __mp_main__parent process: 6576process id: 2232

hello bob

深入理解Python 多線程

其實這幅圖片的意思是,每一個子進程都是由他父進程啟動的。

進程間通訊

我們說兩個進程之間的內(nèi)存之間是相互獨立的,那么這兩個進程能夠進行通信嗎?說A進程向訪問B進程的數(shù)據(jù),能訪問嗎?肯定是不可以訪問的!但是,我就是想訪問,也就是兩個獨立的內(nèi)存想互相訪問,那該怎么辦呢?

有那么幾種方式,但是呢!萬變不離其宗,也即是說你必須找到一個中間件,有那么幾種中間件,那么先來看看是哪幾種

第一種Queues

使用方法跟threading里的queue差不多

from multiprocessing import Process, Queuedef f(q): q.put([42, None, ’hello’])if __name__ == ’__main__’: q = Queue() p = Process(target=f, args=(q,)) p.start() print(q.get()) # prints '[42, None, ’hello’]' p.join()

我們看這兩個進程,父進程的q是怎么傳給子進程的?我們來討論一下

現(xiàn)在我們是不是認為數(shù)據(jù)共享了,兩個進程共享了一個q,其實不是的,其實是相當于克隆了一個q,然后在父進程里創(chuàng)建個子進程,也就是父進程把自己的q克隆了一份交給了子進程,子進程這個時候往這個q里面放了一份數(shù)據(jù),父進程能夠獲取到 。那么這么說就不對了,那克隆了一個q,也就是兩個q了,B往q里放了一個數(shù)據(jù),那么與另一個q,也就是A的q也就沒關(guān)系了,噯,按說是這個樣子的,但是實際上呢,它是不是想實現(xiàn)個數(shù)據(jù)的共享啊,就相當于把A這個q里的數(shù)據(jù)序列化了,序列化到了一個中間的位置,而中間位置有一個翻譯,他把這個數(shù)據(jù)反序列化給A,放在了A的q里,那么也就是實現(xiàn)了所謂的數(shù)據(jù)共享了。

程序執(zhí)行的結(jié)果為:

[42, None, ’hello’]

第二種Pipes

Pipe()函數(shù)返回一個由管道連接的連接對象,默認情況下是雙工(雙向)。 例如:

from multiprocessing import Process, Pipedef f(conn): conn.send('父親,安好?') # 兒子發(fā) print('son receive:',conn.recv()) conn.close()if __name__ == ’__main__’: parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print('father receive:',parent_conn.recv()) # 父親收 parent_conn.send('兒子,安好?') p.join()

程序執(zhí)行后的結(jié)果為:

father receive: 父親,安好?son receive: 兒子,安好?

Pipe()返回的兩個連接對象代表管道的兩端。 每個連接對象都有send()和recv()方法(以及其他方法)。 請注意,如果兩個進程(或線程)同時嘗試讀取或?qū)懭牍艿赖耐欢耍瑒t管道中的數(shù)據(jù)可能會損壞。 當然,同時使用管道的不同端部的過程不存在損壞的風險。

第三種Managers

Manager()返回的管理器對象控制一個服務器進程,該進程保存Python對象并允許其他進程使用代理操作它們。

Manager()返回的管理器將支持類型列表,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Barrier,Queue,Value和Array。 例如,

from multiprocessing import Process, Managerimport osdef f(d, l): d[1] = ’1’ d[’2’] = 2 d[0.25] = None l.append(os.getpid()) print(l)if __name__ == ’__main__’: with Manager() as manager: d = manager.dict() # 用專門的語法生成一個可在多個進程之間進行傳遞和共享的一個字典 l = manager.list(range(5)) # # 用專門的語法生成一個可在多個進程之間進行傳遞和共享的一個列表,默認里有5個數(shù)據(jù) p_list = [] for i in range(10): p = Process(target=f, args=(d, l)) p.start() p_list.append(p) for res in p_list: res.join() print(d) print(l)

程序執(zhí)行的結(jié)果為:

[0, 1, 2, 3, 4, 2100][0, 1, 2, 3, 4, 2100, 7632][0, 1, 2, 3, 4, 2100, 7632, 5788][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760, 7072][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760, 7072, 7540][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760, 7072, 7540, 3904][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760, 7072, 7540, 3904, 7888][0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760, 7072, 7540, 3904, 7888, 7612]{1: ’1’, ’2’: 2, 0.25: None}[0, 1, 2, 3, 4, 2100, 7632, 5788, 6340, 5760, 7072, 7540, 3904, 7888, 7612]

進程鎖與進程池

進程鎖

進程也有一個鎖,what?進程不都獨立了嗎?不涉及同時修改同一個數(shù)據(jù),怎么還會有鎖呢?

閑了來看看它的表現(xiàn)形式,幾乎和線程是一模一樣的

from multiprocessing import Process, Lockdef f(l, i): l.acquire() try: print(’hello world’, i) finally: l.release()if __name__ == ’__main__’: lock = Lock() for num in range(10): Process(target=f, args=(lock, num)).start()

程序執(zhí)行的結(jié)果為:

hello world 3hello world 1hello world 2hello world 5hello world 7hello world 4hello world 0hello world 6hello world 8hello world 9

那這種鎖有什么作用呢?

作用其實就是防止打印在屏幕上的信息發(fā)生錯亂現(xiàn)象!

進程池

在上面的程序中,啟動100個進程會發(fā)現(xiàn)變慢了,因為起一個進程就相當克隆了一份父進程的內(nèi)存數(shù)據(jù),如果父進程占一個G的內(nèi)存空間,那我起100個進程,就相當于101G了,在這種情況下,開銷是非常大的,就像起一個進程?E嚓又克隆了一個屋子,一會就把哈爾濱占滿了,所以開銷特別大,為了避免?E嚓起那么多的進程,把系統(tǒng)打趴下,所以這里有個進程池的限制。

進程池就是同一時間有多少進程在CPU運行。

進程池中有兩個方法:

apply(同步執(zhí)行,串行) apply_async(異步執(zhí)行、并行)

from multiprocessing import Process,Pool,freeze_supportimport timeimport osdef Foo(i): time.sleep(2) print('in process',os.getpid()) return i+100def Bar(arg): print(’-->exec done:’,arg)if __name__ == ’__main__’: freeze_support() pool = Pool(5) # 允許進程池里同時放入5個進程 for i in range(10): # pool.apply_async(func=Foo, args=(i,),callback=Bar) # callback 回調(diào) pool.apply(func=Foo, args=(i,)) # 串行 # pool.apply_async(func=Foo, args=(i,)) # 并行 print(’end’) pool.close() pool.join() # 進程池中進程執(zhí)行完畢后再關(guān)閉,如果注釋,那么程序直接關(guān)閉。

程序的執(zhí)行結(jié)果為:

in process 7824in process 6540in process 7724in process 8924in process 9108in process 7824in process 6540

知識點擴充:

__name__ == ’__main__’的作用是:

手動執(zhí)行關(guān)于這段代碼的程序,那么他下面的程序就會執(zhí)行,如果是調(diào)用這段代碼的程序時,那么它下面的程序就不會執(zhí)行

以上就是深入理解Python 多線程的詳細內(nèi)容,更多關(guān)于Python 多線程的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品一级二级| 亚洲精品动态| 国产精品成人a在线观看| 日韩欧美中文在线观看| 国产午夜精品一区二区三区欧美| 色婷婷综合网| 岛国av在线网站| 国产精品夜夜夜| 欧美亚洲综合视频| 青青草精品视频| 国产欧美视频在线| 欧美精品97| 美女福利一区二区三区| 亚洲精品888| 日韩黄色免费网站| 免费在线亚洲欧美| 欧美日韩一二| 亚洲免费福利一区| 国产日韩精品视频一区二区三区| 日本麻豆一区二区三区视频| 国产欧美一级| 亚洲婷婷免费| 久久av在线| 日韩午夜视频在线| 精品久久久久中文字幕小说| 久久精品国产www456c0m| 亚洲人www| 国产日韩欧美三级| 福利一区二区三区视频在线观看| caoporn视频在线| 一二三区精品| 亚洲成av在线| 老鸭窝一区二区久久精品| 一本一本久久| 国产 日韩 欧美 综合 一区| 亚洲精品欧洲| 在线国产一区| 久久免费精品| 日韩在线麻豆| 一级欧洲+日本+国产| 狠狠久久伊人中文字幕| 国产aⅴ精品一区二区三区久久| 亚洲一区国产一区| 国产成人精品999在线观看| 精品午夜视频| 亚洲精品成人一区| 国产毛片精品久久| 青青国产精品| 综合日韩av| 国产极品久久久久久久久波多结野| 免费久久精品视频| 色爱综合av| 欧美日韩免费观看一区=区三区| 国产精品亚洲产品| 精品视频网站| 亚洲涩涩av| 日本精品在线播放| 日韩精品一区二区三区中文 | 久久亚洲欧美| 中文字幕亚洲精品乱码| 亚洲另类av| 四虎精品一区二区免费| 911亚洲精品| 日韩精品视频一区二区三区| 伊人久久在线| 国产精品手机在线播放| 在线日韩电影| 亚洲综合欧美| 国产亚洲精aa在线看| 97精品97| 欧美高清不卡| 美女视频黄免费的久久| 日本欧美不卡| 欧美日韩亚洲一区三区| 视频在线观看国产精品| 91久久久精品国产| 久久av综合| 亚洲精品美女| 日韩精品永久网址| 丁香六月综合| 欧美日韩亚洲在线观看| 日韩欧美中文字幕在线视频| 激情欧美一区二区三区| 久久精品资源| 久久国产精品亚洲77777| 久久久久久亚洲精品美女| 免费日韩一区二区| 亚洲二区精品| 免费看一区二区三区| 巨乳诱惑日韩免费av| 岛国av在线网站| 国产精品免费精品自在线观看| 夜夜嗨一区二区| 电影91久久久| 国产福利资源一区| 免费在线欧美视频| 亚洲精品人人| 国产精品美女久久久久久不卡| 亚洲精品少妇| 亚洲欧洲一区二区天堂久久| 久久精品国产精品亚洲毛片| 久久一区精品| 日本久久二区| 国产精品视频一区视频二区| 欧美99久久| 欧美日韩国产在线一区| 中文字幕在线官网| 国产传媒在线| 午夜av不卡| 午夜影院一区| 性欧美videohd高精| 国产夫妻在线| 在线观看精品| 青青草视频一区| 视频福利一区| 亚洲91网站| 国精品产品一区| 亚洲欧美日韩国产| 婷婷综合网站| 久久国产人妖系列| 美女视频黄 久久| 久久精品青草| 日韩精品欧美成人高清一区二区| 青青草91视频| 国产精品一区二区免费福利视频| 国产精品白丝一区二区三区| 色综合www| 国产免费成人| 国产精品成人国产| 日韩在线观看一区二区| 97精品97| 国产精品videossex| 欧美日韩国产一区精品一区| 亚洲欧洲一区| 精品久久久久久久| 日本欧美在线看| 国产91精品对白在线播放| 日韩精品一区二区三区中文在线| 私拍精品福利视频在线一区| 亚洲精品欧洲| 激情视频一区二区三区| 精品视频国产| 日韩精品1区2区3区| 中文无码日韩欧| 91精品国产一区二区在线观看| 香蕉成人av| 国产精品夜夜夜| 天堂va欧美ⅴa亚洲va一国产| 欧美性感美女一区二区 | 欧美国产另类| 亚洲欧洲专区| aa国产精品| 狠狠久久伊人| 欧美一区网站| 喷白浆一区二区| 伊人久久大香线蕉av不卡| 精品国产亚洲日本| 亚洲一区欧美激情| 激情综合网站| 亚洲精品99| 亚洲激情精品| av成人国产| 国产欧美日韩免费观看| 精品视频自拍| 久久黄色影院| 精品国产一区二区三区2021| 精品欧美日韩精品| 亚洲精品成a人ⅴ香蕉片| 蜜臀av一区二区在线免费观看| 国产在线不卡| 日韩精品亚洲aⅴ在线影院| 国产福利一区二区精品秒拍 | 久久字幕精品一区| 欧美精品三级在线| 最新日韩欧美| 在线一区av| 精品福利久久久| 国产精品调教视频| 粉嫩av一区二区三区四区五区 | 国产精品一在线观看| 日韩欧美1区| 精品视频91| 国产欧美日韩精品一区二区免费| 日韩网站中文字幕| 国产精品成人自拍| 9国产精品视频| 国产精品对白| 黄毛片在线观看| 国产99精品| 欧美亚洲网站| 精品国内亚洲2022精品成人| 国产一区二区三区91| 欧美精品一二| 日本亚洲不卡| 黑人精品一区| 国产日韩三级| 一区二区三区国产盗摄| 视频一区在线视频| 美女国产一区二区三区| 久久狠狠久久|