成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

經(jīng)驗(yàn)拾憶(純手工)=> Python三程

Snailclimb / 2811人閱讀

摘要:多線程對(duì)于爬蟲方面也可以表現(xiàn)出較好的性能。計(jì)算密集型就別想多線程了,一律多進(jìn)程。所以同一時(shí)刻最大的并行線程數(shù)進(jìn)程數(shù)的核數(shù)這條我的個(gè)人理解很模糊,參考吧多線程多線程有種通過的那種方式,非常普遍,此處就不寫了。

GIL的理解
GIL這個(gè)話題至今也是個(gè)爭議較多的,對(duì)于不用應(yīng)用場景對(duì)線程的需求也就不同,說下我聽過的優(yōu)點(diǎn):
1. 我沒有用過其他語言的多線程,所以無法比較什么,但是對(duì)于I/O而言,Python的線程還是比較高效的。
2. 有些第三方基于Python的框架和庫,比如Tensorflow等基于C/C plus plus重寫的Python線程機(jī)制。
3. 至于換成Cython編譯器解決GIL,這個(gè)只是聽過,沒用過。
4. Python多線程對(duì)于web、爬蟲方面也可以表現(xiàn)出較好的性能。
5. Python多進(jìn)程是完好的,可以把資源消耗較少的非必要線程工作轉(zhuǎn)為多進(jìn)程來工作。
6. 計(jì)算密集型就別想多線程了,一律多進(jìn)程。
7. Python還有細(xì)粒度且高效的協(xié)程。
8. 如果有N核CPU,那么同時(shí)并行的進(jìn)程數(shù)就是N,每個(gè)進(jìn)程里面只有一個(gè)線程能搶到工作權(quán)限。
   所以同一時(shí)刻最大的并行線程數(shù)=進(jìn)程數(shù)=CPU的核數(shù)(這條我的個(gè)人理解很模糊,參考吧)
多線程
多線程有2種通過start的那種方式,非常普遍,此處就不寫了。
新版線程池 future庫 是python3.2新出的功能(記住這個(gè)future)
方式1:(sublime運(yùn)行后直接貼上來了)
    from time import sleep
    from concurrent.futures import ThreadPoolExecutor,as_completed,ALL_COMPLETED,wait
    
    executor = ThreadPoolExecutor(max_workers=10)        # 初始化線程池10個(gè)坑
    def f():
        sleep(15)
        return 100
    all_tasks = [executor.submit(f) for _ in range(10)]  # 提交10個(gè)線程,全放池里執(zhí)行
    # for per_thread in as_completed(all_tasks):         
        # print(per_thread.result())
    ---------# 注意上面,as_completed(all_tasks) 是等待future對(duì)象完成后才執(zhí)行主線程
    ---------# 注意下面,wait和 as_completed() 的 作用一樣,就和普通版的join() 相似
    for per_thread in all_tasks:
        print(per_thread.result())
    wait(all_tasks, return_when=ALL_COMPLETED)   # 還可以選FIRST_COMPLETED,待第一個(gè)完成后
    print("主線程")
        
方式2: map多線程版
    value_list = executor.map(func, list(range(10))) # 返回的直接是map后的序列
    for value in value_list:
        print(value)
    注意:    
        這個(gè)map方式,如果要傳多個(gè)參數(shù)就涉及到高階函數(shù)那節(jié)講的偏函數(shù)了。
多進(jìn)程
多進(jìn)程有2種通過start的那種方式+普通進(jìn)程池,同樣非常普遍,此處就不寫了,自己百度一下。
新版進(jìn)程池 同樣是和上面用一樣的future庫,驚不驚喜。(可以看出好的程序要向著統(tǒng)一封裝的方向優(yōu)化)
也許你會(huì)驚訝,因?yàn)橹话裻hread單詞改為processing就是進(jìn)程池版本了,就是這么簡單?。。。?!
from time import sleep
import multiprocessing
from concurrent.futures import ProcessPoolExecutor,as_completed,ALL_COMPLETED,wait
executor = ProcessPoolExecutor(max_workers=multiprocessing.cpu_count())
def f():
    sleep(15)
    return 100

if __name__ == "__main__":    # 這句要加
    all_tasks = [executor.submit(f) for _ in range(multiprocessing.cpu_count())]
    for per_thread in as_completed(all_tasks):
        print(per_thread.result())
    # for per_thread in all_tasks:
    #     print(per_thread.result())
    # wait(all_tasks, return_when=ALL_COMPLETED)
    print("主進(jìn)程")   
# 這就是 futures 模塊 設(shè)計(jì)思想的魅力
多協(xié)程
前言:
    也許你記得,函數(shù)用到 yield 來代替 return 就變成了 生成器。其特點(diǎn)是代碼片段斷點(diǎn)式執(zhí)行。
    如果有多個(gè)yield, 就可以自己用程序來切換執(zhí)行程序。(這就是協(xié)程的特點(diǎn))
推薦:(學(xué)習(xí)中。。。)
    此筆者寫的很好:
    https://juejin.im/post/5ccf0d18e51d453b557dc340
    
    

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43848.html

相關(guān)文章

  • 經(jīng)驗(yàn)拾憶手工)=> Python高階函數(shù)操作

    摘要:解釋就相當(dāng)于把每個(gè)序列元素的每一個(gè)單獨(dú)用一個(gè)管道函數(shù)處理,再把他們按順序組合成一個(gè)新可迭代對(duì)象注意這個(gè)管道函數(shù)只能是單參數(shù)函數(shù),如果想傳遞多個(gè)參數(shù)怎么辦使用偏函數(shù)怕有些人看不懂,這里就不用了,而是用普通函數(shù)定義方式固定值固定值固定值固定值固 map In [25]: list(map(lambda a:a**2, [1,2,3,4])) Out[25]: [1, 4, 9, 16] 解...

    Elle 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python基本數(shù)據(jù)類型

    摘要:不要疑惑,告訴你答案這個(gè)代表正負(fù)號(hào)的正。雖然一點(diǎn)技術(shù)含量沒有,但是你要懂序列也許叫可迭代對(duì)象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無法增刪改, 只可查 升操: + 與...

    Andrman 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python__黑魔法__

    摘要:類的繼承類繼承有三種調(diào)用方式,其實(shí)是有區(qū)別的,聽我慢慢道來第一種父類方法參數(shù)直接調(diào)用第二種方法參數(shù)直接調(diào)用在誰的類下調(diào)用,就找此類對(duì)應(yīng)的下一個(gè)就是要繼承的第三種方法參數(shù)找類名對(duì)應(yīng)的的下一個(gè),就是繼承的,一般寫本身的類名上下文管理器上下文管理 類的繼承 類繼承有三種調(diào)用方式,其實(shí)是 有區(qū)別 的,聽我慢慢道來 class A: def say(self, name): ...

    tulayang 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python三器

    摘要:也就是給原函數(shù)加個(gè)外殼。類裝飾填充了啊我是原函數(shù)類裝飾填充了啊我是原函數(shù)說明后面關(guān)于類的裝飾器如果理解困難當(dāng)做了解即可,用的也少。 可迭代對(duì)象、生成器、迭代器三者的關(guān)系 1. 迭代器一定是可迭代對(duì)象 2. 生成器是迭代器的一種 3. 可迭代對(duì)象:必須實(shí)現(xiàn) __iter__方法 4. 迭代器:必須實(shí)現(xiàn) __iter__方法 和 __next__ 方法 5. 生成器:必須實(shí)現(xiàn) __it...

    Miracle_lihb 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python正則全解詳解

    預(yù)編譯 import re re1 = re.compile(r元字符 組成的正則規(guī)則) # 元字符下面會(huì)說 re1.方法() # 方法下邊也會(huì)說 元字符: 表示普通字符: . # 除了 外 都可以匹配的到 d # 只匹配 純數(shù)字 0-9 D # 和 d相反, 除了數(shù)字全都匹配 ...

    Luosunce 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<