任务例子:喝水、吃饭动做须要耗时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本次添加进进程池的任务,添加的同时开始执行,结束了才开始下一次添加