任務例子:喝水、吃飯動做須要耗時1Sapp
單任務:(耗時20s)async
for i in range(10):orm
print('a正在喝水')隊列
time.sleep(1)進程
print('a正在吃飯')ip
time.sleep(1)資源
1、多進程(耗時10s)get
multiprocessing模塊開啓2個進程實現同步
代碼以下:消息隊列
import multiprocessing
import time
def start(fuc):
for i in range(10):
print('正在{}'.format(fuc))
time.sleep(1)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=start,args=('喝水',))
p2 = multiprocessing.Process(target=start,args=('吃飯',))
p1.start()
p2.start()
2、多進程:如何共享資源
方案1:使用內置的消息隊列Queue
def start(fuc,q):
for i in range(10):
# 向隊列中加入一個信息:fuc
q.put(fuc)
time.sleep(1)
if __name__ == '__main__':
# 定義一個消息隊列,默認存儲的隊列信息爲5個
q = multiprocessing.Queue(5)
p1 = multiprocessing.Process(target=start,args=('喝水',q))
p2 = multiprocessing.Process(target=start,args=('吃飯',q))
p1.start()
p2.start()
while True:
# 從隊列中取出一個信息(先放入的先被取出來)
print(q.get())
3、多進程:進程池
當咱們的任務不少時,或者任務數量不必定時,無限的建立進程會致使程序崩潰,能夠固定使用幾個進程來分配完成這些任務
(好比10個新app須要研發,3個研發團隊,一個個的去完成)
def start(num):
print('--開始執行任務{}--'.format(num))
time.sleep(2)
print('--結束執行任務{}--'.format(num))
if __name__ == '__main__':
# 定義一個進程池,至多開啓2個進程
pool = multiprocessing.Pool(2)
# 向進程池中添加新任務
pool.apply_async(start, args=(1,))
pool.apply_async(start, args=(2,))
pool.apply_async(start, args=(3,))
pool.apply_async(start, args=(4,))
# 關閉進程池
pool.close()
# 在此阻塞,等到進程池任務所有完成,子進程所有結束,再執行下面的代碼
# 如不阻塞等待,主進程若是在下面終止了,則子進程所有終止
pool.join()
pool.apply_async等待進程池關閉後開啓同步執行子進程pool.apply本次添加進進程池的任務,添加的同時開始執行,結束了纔開始下一次添加