线程、进程和协程
目前,多核计算机广泛存在,进程和线程以及协程的使用也很普遍。
线程是计算机的基本处理的基本单元,一个应用可能有几个进程,一个进程可能有几个线程。
进程是不共享数据的,每一个进程的数据都是独立的;线程是共享全局数据的,因为线程存在数据安全问题。
比如应用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方法,获取进程的返回结果。