模塊和類
多進(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的整個過程包括:
- 創(chuàng)建對象并初始化(執(zhí)行init方法);
- 收到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()