Python組合類的多進(jìn)程異步實現(xiàn)

模塊和類


多進(jìn)程模塊

multiprocessing

多進(jìn)程類

multiprocessing.Process
multiprocessing.Pool

用戶類

A、B、C
其中B、C類組合為A,(原設(shè)想為B、C繼承A,考慮到B、C的功能需要多線程/進(jìn)程同時運(yùn)行,因此采用組合類的方式)

用戶類的組合


class A(object):
    def __init__(self, user):
        self.user = user
        self.b = B("B", self.user)
        self.c = C("C", self.user)

class B(object):
    def __init__(self, things, user):
        self.user = user
    def print(self):
        print self.user

class C(object):
    def __init__(self, things, user):
        self.user = user
    def print(self):
        print self.user

B類繼承多進(jìn)程類


class B(multiprocessing.Process):
    def __init__(self, things, user):
        multiprocessing.Process.__init__(self)
        self.user = user
    def print(self):
        print self.user
    def run(self):
        self.print()

運(yùn)行進(jìn)程

a = A("me")
a.b.start()

若需要單獨(dú)傳B的參數(shù),而非在A類中限定死,那么改變A類中對B的組合形式,將B類從成員改為方法

class A(object):
    def __init__(self, user):
        self.user = user
    def Do_B(self, things):
        return B(things, self.user)
    def Do_C(self, things):
        return C(things, self.user)

此時運(yùn)行進(jìn)程方式變?yōu)?/p>

a = A("me")
a.Do_B("hello").start()

B的整個過程包括:

  1. 創(chuàng)建對象并初始化(執(zhí)行init方法);
  2. 收到start請求后執(zhí)行run方法。

雖然對單一線程來說,將run方法中的執(zhí)行語句放在init方法中也會有一樣的結(jié)果,但當(dāng)你嘗試異步執(zhí)行該線程時會發(fā)現(xiàn),即使你用了異步方法,結(jié)果確實同步執(zhí)行。原因就在于繼承Process類的子類在初始化對象時需要執(zhí)行init方法,因此不能偷懶在初始化時執(zhí)行過多方法,只做一些賦初值操作是一個很好的選擇。

使用Pool類


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

pool = multiprocessing.Pool()

可以指定并發(fā)進(jìn)程數(shù),默認(rèn)為cpu內(nèi)核數(shù)

# 指定并發(fā)數(shù)為2
pool = multiprocessing.Pool(2)
# 指定并發(fā)數(shù)為cpu內(nèi)核數(shù)-1
pool = multiprocessing.Pool(multiprocessing.cpu_count()-1)

異步運(yùn)行進(jìn)程

a = A("me")
# 創(chuàng)建B類對象
aa = a.Do_B("aa")
bb = a.Do_B("bb")
cc = a.Do_B("cc")
dd = a.Do_B("dd")
ee = a.Do_B("ee")
list = [aa, bb, cc, dd, ee]
for i in range(5)
# 將對象添加到進(jìn)程池,并用異步方法啟動
    pool.apply_async(list[i])
# 停止新的進(jìn)程加入進(jìn)程池
pool.close()
# 阻塞主進(jìn)程
pool.join()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 又來到了一個老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個問題開始,來談?wù)劜?..
    tangsl閱讀 4,323評論 0 23
  • 好想大哭一頓 難過 惱火-_-# 不開森 笨死自己算了 什么都做不好 總犯錯 一天拍排了一個微信推文還出錯 讓我緩...
    King木子木木亦大閱讀 156評論 0 0
  • part1 幾個月前,我可以說每天很努力的工作,是想真正體會到什么是經(jīng)濟(jì)獨(dú)立,我從每天賺幾十一百到好幾百甚至幾千(...
    散人游勇閱讀 3,935評論 2 4
  • 沒有一點(diǎn)點(diǎn)防備,也沒有一絲顧慮。夏天就這樣出現(xiàn)在我的世界里,身姿熱辣,內(nèi)心溫柔。 一切都像封閉在烤爐里,沾染上火焰...
    劉懋偉閱讀 461評論 1 3
  • 初冬的天很冷,她散亂了著頭發(fā)無精打采的坐在還沒有暖氣的屋子里靜靜的望著窗外。難得有這樣一個下午供她去浪費(fèi),不...
    晨熙_88f9閱讀 473評論 2 1

友情鏈接更多精彩內(nèi)容