Python中的多进程和进程池

在这里插入图片描述线程、进程和协程
目前,多核计算机广泛存在,进程和线程以及协程的使用也很普遍。

线程是计算机的基本处理的基本单元,一个应用可能有几个进程,一个进程可能有几个线程。

进程是不共享数据的,每一个进程的数据都是独立的;线程是共享全局数据的,因为线程存在数据安全问题。

比如应用a有三个功能,下载,视频播放,音频播放功能,三个功能可能就是三个进程,每个功能有需要几个线程来处理不同的事物。

还有一种理解方式-----流水线。进程相当于一条流水线,线程相当于流水线上的一个工位,流水线1和流水线2之间的物资是不共享的,流水线1用来制造灯,流水线2用来制造鞋,对于单个流水线上的工位,工位1用来在灯上打个标志,工位2用来给灯上安装包装,所以工位之间是共享资源的,因为他们在做同一件事。

协程是一种分时处理的概念(自己表述),处理任务1时需要等一会,此时任务切换任务2,任务2又需要等一会,切换到任务3,依次循环执行。

为了提高程序的并发以及处理能力,有多进程+多线程;多进程+协程;多线程+协程等组合。
在这里插入图片描述
多进程和进程池
进程函数/方法

def process_test(name):

print(name,os.getpid(),os.getppid())

#os.pid 当前运行进程的id

#os.ppid 当前进程的父进程的id,也就是主进程的id,程序里创建的进程都是主代码(进程)的子进程

导入模块和包:

from multiprocessing import Pool

from multiprocessing import Process

python中实现多进程,这里总结了三种实现方法:

第一种:基本方式,利用process建立每个进程,并开启进程。

#建立进程

p1 = Process(target = process_test,args= ("test1"))    

p2 = Process(target=process_test,args = ("test2"))

#target为进程中调用的方法,args是function中的param,注意是个元组。

#启动进程

p1.start()

p2.start()

#阻塞主进程(否则不等子进程运行完,主进程就可能运行完了)

p1.join()-----等p1进程运行完

p2.join()

这是基本方式中的简单形势,当然你也可以通过使用for遍历批量生成进程。

ok,基本方式就这样。

第二种方式,使用pool来建立进程池,map方式

#第一步建立进程池

user_pool = Pool(processes = 10)

#建立进程并启动

result = user_pool.map(process_test,[“test1”,“test2”])#function,参数列表

#result是每个进程的返回值,是一个列表

#备注:使用map是堵塞的方式,map自带close和join方法(使用pool实现堵塞的两个方法)。

ok

在这里插入图片描述第三种方式,使用pool利用apply_async方式

#第一步,建立进程池

user_pool = Pool(processes = 10)

#第二步,建立进程并启动

result1 = user_pool.async(process_test,(“test1”,))

result2 = user_pool.async(…“test2”)#拿到任务就去执行了,主进程里做阻塞–第三步

#第三步,堵塞主进程

user_pool.close()#关闭进程池

user_pool.join()#join前需关闭进程池,不在往进程池里面添加进程了

#第四步,获取数据

result1.get()#开启进程池时返回一个对象,运行完成后,调用对象 的get方法,获取进程的返回结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值