搖滾吧!多進(jìn)程!

搖滾吧毫炉!多進(jìn)程

由于cpython GIL的特性施逾,在單核下是完美的钉答,但是面對(duì)多核,老爹的推薦是開(kāi)啟多進(jìn)程灸叼,所以要發(fā)揮多核最好利用多進(jìn)程

什么是進(jìn)程

進(jìn)程是程序執(zhí)行中資源分配的基本單元神汹。程序執(zhí)行說(shuō)明了他是動(dòng)態(tài)的,就會(huì)有等待和執(zhí)行古今,僵尸等狀態(tài)屁魏。而資源分配就是指的堆棧,數(shù)據(jù)段捉腥,信號(hào)等氓拼。

進(jìn)程的創(chuàng)建

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',)) # 獲得句柄
    p.start() # 運(yùn)行進(jìn)程
    p.join() # 等待子進(jìn)程退出

當(dāng)調(diào)用Process的時(shí)候,實(shí)際并沒(méi)有創(chuàng)建子進(jìn)程抵碟,只是創(chuàng)建了一個(gè)關(guān)聯(lián)句柄桃漾,這個(gè)句柄包含當(dāng)前環(huán)境的進(jìn)程ID,就是父進(jìn)程iD拟逮,子進(jìn)程的標(biāo)識(shí)撬统,子進(jìn)程啟動(dòng)之后的任務(wù),還有參數(shù)傳遞敦迄。

當(dāng)你調(diào)用start函數(shù)執(zhí)行的時(shí)候恋追,就會(huì)調(diào)用fork創(chuàng)建子進(jìn)程凭迹,而子進(jìn)程就會(huì)執(zhí)行“_bootstrap”函數(shù),并最終調(diào)用"run"方法苦囱,如果run方法不是循環(huán)嗅绸,那么執(zhí)行完成就會(huì)退出了。run方法默認(rèn)是執(zhí)行你之前填入的target方法和參數(shù)的,target(*args, **kwargs)撕彤。

join實(shí)際上是父進(jìn)程等待子進(jìn)程完成退出的意思鱼鸠。子進(jìn)程的默認(rèn)計(jì)數(shù)是從1開(kāi)始的。

第二種創(chuàng)建進(jìn)程的方法

 from multiprocessing import Process

  class Worker(Process):
      def __init__(self, *args, **kwargs):
          """可定制參數(shù)"""
          super(Worker, self).__init__(*args, **kwargs)

      def run(self):
          """可重寫(xiě),比如不通過(guò)輸入?yún)?shù)來(lái)指定羹铅,可以通過(guò)隊(duì)列來(lái)獲取數(shù)據(jù)"""
          print("I am rocking")
          super(Worker, self).run()

  def f(name):
      print(" hello world!:", name)

  if __name__ == "__main__":
      w = Worker(target=f, args=("Bomb",) )
      w.start()
      w.join()

為什么我一般不用pool而采用process蚀狰,如果只是簡(jiǎn)單類(lèi)似于map計(jì)算,是可以使用map的睦裳,但是面對(duì)復(fù)雜的業(yè)務(wù),我會(huì)選擇process撼唾,因?yàn)樽约焊鶕?jù)業(yè)務(wù)控制行為廉邑。

常用屬性

p.run# 主要用于overrite的方法
p.start() # 創(chuàng)建子進(jìn)程
p.join() # 父進(jìn)程等待子進(jìn)程完成
p.name # 子進(jìn)程的名字
p.is_alive() # 查看子進(jìn)程是否存活
p.pid# 子進(jìn)程起來(lái)之后,才有值
p.terminate() #殺死子進(jìn)程

進(jìn)程的通訊

進(jìn)程間的通訊基本都是共享內(nèi)存,只是形式不一樣倒谷,Queue都是基于pipe實(shí)現(xiàn)的蛛蒙。甚至于有的加了鎖機(jī)制,保證數(shù)據(jù)同步渤愁,比如queue就是線(xiàn)程或者進(jìn)程安全的

Pipe

返回兩個(gè)可連接對(duì)象

from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()

Queue

from multiprocessing import Process, Queue

def 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()

共享狀態(tài)Value牵祟,Array,Copy對(duì)象

https://docs.python.org/2/library/ctypes.html#module-ctypes

from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Value, Array
from ctypes import Structure, c_double

class Point(Structure):
    _fields_ = [('x', c_double), ('y', c_double)]

def modify(n, x, s, A):
    n.value **= 2
    x.value **= 2
    s.value = s.value.upper()
    for a in A:
        a.x **= 2
        a.y **= 2

if __name__ == '__main__':
    lock = Lock()

    n = Value('i', 7)
    x = Value(c_double, 1.0/3.0, lock=False)
    s = Array('c', 'hello world', lock=lock) # lock在于多個(gè)并發(fā)寫(xiě)時(shí)抖格,保證數(shù)據(jù)的一致性
    A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)

    p = Process(target=modify, args=(n, x, s, A))
    p.start()
    p.join()

    print n.value
    print x.value
    print s.value
    print [(a.x, a.y) for a in A]

共享狀態(tài)Managers

managers是一個(gè)管理資源的進(jìn)程诺苹,支持的類(lèi)型 dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value and [Array](https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Array,算是一個(gè)代理雹拄,其他進(jìn)程通過(guò)這個(gè)服務(wù)進(jìn)程獲取數(shù)據(jù)收奔。優(yōu)勢(shì)就是支持多種類(lèi)型的資源,缺點(diǎn)就是得開(kāi)個(gè)進(jìn)程,如果這個(gè)進(jìn)程掛了滓玖,就完蛋了坪哄。

from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Value, Array
from ctypes import Structure, c_double

class Point(Structure):
    _fields_ = [('x', c_double), ('y', c_double)]

def modify(n, x, s, A):
    n.value **= 2
    x.value **= 2
    s.value = s.value.upper()
    for a in A:
        a.x **= 2
        a.y **= 2

if __name__ == '__main__':
    lock = Lock()

    n = Value('i', 7)
    x = Value(c_double, 1.0/3.0, lock=False)
    s = Array('c', 'hello world', lock=lock) # lock在于多個(gè)并發(fā)寫(xiě)時(shí),保證數(shù)據(jù)的一致性
    A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)], lock=lock)

    p = Process(target=modify, args=(n, x, s, A))
    p.start()
    p.join()

    print n.value
    print x.value
    print s.value
    print [(a.x, a.y) for a in A]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末势篡,一起剝皮案震驚了整個(gè)濱河市翩肌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禁悠,老刑警劉巖念祭,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碍侦,居然都是意外死亡棒卷,警方通過(guò)查閱死者的電腦和手機(jī)顾孽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)比规,“玉大人若厚,你說(shuō)我怎么就攤上這事⊙咽玻” “怎么了测秸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)灾常。 經(jīng)常有香客問(wèn)我霎冯,道長(zhǎng),這世上最難降的妖魔是什么钞瀑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任沈撞,我火速辦了婚禮,結(jié)果婚禮上雕什,老公的妹妹穿的比我還像新娘缠俺。我一直安慰自己,他們只是感情好贷岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布壹士。 她就那樣靜靜地躺著,像睡著了一般偿警。 火紅的嫁衣襯著肌膚如雪躏救。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天螟蒸,我揣著相機(jī)與錄音盒使,去河邊找鬼。 笑死七嫌,一個(gè)胖子當(dāng)著我的面吹牛忠怖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抄瑟,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凡泣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了皮假?” 一聲冷哼從身側(cè)響起鞋拟,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惹资,沒(méi)想到半個(gè)月后贺纲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褪测,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年猴誊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潦刃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懈叹,死狀恐怖乖杠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澄成,我是刑警寧澤胧洒,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站墨状,受9級(jí)特大地震影響卫漫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肾砂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一列赎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镐确,春花似錦包吝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)派哲。三九已至臼氨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芭届,已是汗流浹背储矩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褂乍,地道東北人持隧。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逃片,于是被迫代替她去往敵國(guó)和親屡拨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口褥实,提供良好的抽象接口呀狼。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,546評(píng)論 0 5
  • Python 3的多進(jìn)程 多進(jìn)程庫(kù)名叫multiprocessing损离。有幾點(diǎn)記錄一下: multiprocessi...
    小溫侯閱讀 3,346評(píng)論 0 2
  • 寫(xiě)在前面的話(huà) 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,771評(píng)論 0 8
  • 進(jìn)程哥艇、進(jìn)程的使用、進(jìn)程注意點(diǎn)僻澎、進(jìn)程間通信-Queue貌踏、進(jìn)程池Pool十饥、進(jìn)程與線(xiàn)程對(duì)比、文件夾拷貝器-多任務(wù) 1.進(jìn)...
    Cestine閱讀 819評(píng)論 0 0
  • 一祖乳、總體內(nèi)容 1.1逗堵、進(jìn)程、程序的概念 1.2凡资、使用 Process 完成多進(jìn)程- multiprocessing...
    IIronMan閱讀 765評(píng)論 0 1