并发编程(四)

进程的数据共享

进程池-异步提交

进程池-同步提交

进程池-map方法

进程池-回调函数

线程的概念

python开启一个线程

进程的数据共享--Manager+Lock

# 进程间的数据通信是不安全的,应该尽量避免数据通信
# 选择进程间的安全工具来避免加锁带来的问题
# 数据共享--数据库去解决
from multiprocessing import Process,Manager,Lock

def func(dct,l):
    with l:#不加锁共享数据会乱
        dct['count']-=1

if __name__ == '__main__':
    l=Lock()
    m=Manager()
    dct=m.dict({'count':90})
    p_lst=[]
    for i in range(90):
        p=Process(target=func,args=(dct,l))
        p.start()
        p_lst.append(p)
    for i in p_lst:
        i.join()
    print(dct)
例子

进程池

为什么要有进程池的概念?
一个进程:
开启,销毁,调度都要花费时间
如果我们去设置一个固定的进程数(计算机的cpu数),不停的在执行任务,
每个任务并行的去执行,不管进程,哪个任务执行完,后边任务紧接着跟上
就省掉了每个任务去开启进程,销毁进程,调度进程,所需要的时间,进程池完美的解决这个问题
from  multiprocessing import Pool,Process
import time
def func(i):
    #没有IO操作
    i+i

if __name__ == '__main__':
    start = time.time()
    """利用进程池去执行20个任务"""
    p = Pool()
    for i in range(20):
        p.apply_async(func=func,args=(i,))
    p.close()#关闭进程池,防止继续操作
    p.join()#等待所有进程池执行完任务后,只能在close和terminate后使用
    print('pool:', time.time() - start)

    p_lst=[]
    start1=time.time()
    for i in range(20):
        """利用20个进程分别执行任务"""
        p=Process(target=func,args=(i,))
        p.start()
        p_lst.append(p)
    for p  in p_lst:
        p.join()
    print('process:',time.time()-start)

# 运行结果
# pool: 0.9140844345092773
# process: 4.7408812046051025
Pool的基本使用
主要方法:
1.apply_async#异步调用
2.apply#同步调用
3.close()#关闭进程池,防止继续操作
4.join()#在进程池执行完所有任务,在close()terminatef()后面使用
主要方法
可以取到返回值,
get()
同步直接是返回值
异步需要get()
其他方法

猜你喜欢

转载自www.cnblogs.com/liuer-mihou/p/10451628.html
今日推荐