Python档案袋( 进程与协程 )

Python档案袋( 进程与协程 ),第1张

概述Python的进程和线程是使用的 *** 作系统的原生线程和进程,其是去调用 *** 作系统的相应接口实现 进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程 线程:基于进程,之间可直接共享数据,可执行,只

Python的进程和线程是使用的 *** 作系统的原生线程和进程,其是去调用 *** 作系统的相应接口实现

进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程

线程:基于进程,之间可直接共享数据,可执行,只有所有的线程执行完毕程序才会退出

守护线程:生命值依赖于创建它的主线程,主程序亡,不管守护进程执行到何步也必须立即亡

多线程:不适用与cpu *** 作任务大的(如计算等),较适合于IO *** 作任务大的(如文件读写等)

进程

简单的进程

windows上启动进程必须加入【if __name__=="__main__":】,而在linux上则可随意,进程的使用基本与线程相同

import multiprocessing timedef run11():   print("-----  进程  ----")# win 进程启动,必须加入这句if __name__==__main__:    启动进程   t1=multiprocessing.Process(target=run11,args=())   t1.start()

进程间传递数据之进程队列:

 1  2  3  run11(qqListx): 4    ****** 进入进程 ********) 5    设置进程数据 6    qqListx.put(11111122 7  8  9 :10 11     进程队列12     qqListx = multiprocessing.Queue()13 14     启动进程,必须传递进程队列15     t1=multiprocessing.Process(target=run11,1)">(qqListx,))16     t1.start()17 18     得到进程数据:",qqListx.get())

进程间传递数据之管道:

 run11(pp1): 5  6    发送数据 7    pp1.send(东小东 8    收到mian进程发来的数据:,pp1.recv()) 9 10 11 12 13     得到管道 得到两端,如同socket的服务器和客户端15     任意一端都可以进行收发16     pp1,pp2 = multiprocessing.Pipe()启动进程,传递任意一端19     t1=multiprocessing.Process(target=run11,1)">(pp1,1)">20 21 22     另一端接收数据23     24     pp2.send(收到数据了东小东")

进程之数据共享:

两个进程进行数据共享,列表或者字典数据共享

 run11(vv): 6    vv[dong"]=dongxiaodong" 7    vv.append("555") #列表 8 11 12     方法一  -------------: with multiprocessing.Manager() as mssaagex:       dictx=mssaagex.dict() #得到字典参数       #Listx=mssaagex.List() #得到列表参数16     #17            #启动进程,传递字典或者列表       t1=multiprocessing.Process(target=run11,args=(dictx,))19            t1.start()20     21            #等待进程接收       t1.join()24            #打印字典数据25            print("得到进程数据:",dictx)26 27      方法二  -------------------:28      dictx=multiprocessing.Manager().dict() 得到字典参数29      Listx=multiprocessing.Manager().List() #得到列表参数30 31      启动进程,传递字典或者列表32      t2=multiprocessing.Process(target=run11,1)">(dictx,1)">33      t2.start()34 35      等待进程接收36      t2.join()37 38      打印字典数据39       4     vv.acquire() 上锁 5      6     vv.release()  解锁12      lockx=multiprocessing.Lock() 得到进程锁14      t2=multiprocessing.Process(target=run11,1)">(lockx,1)">15      t2.start()

进程池:

确定进程的同时运行个数,更好的进行进程管理

 2  time 3  4  5     time.sleep(1 6     回调函数在主进程中运行 Cal(arg):每个进程的回调函数13 14 15 16      poolx=multiprocessing.Pool(2) 得到进程池,最多同时执行2个进程18      启动进程19      for i in range(10):20          poolx.apply_async(func=run11,args=(i,)) #并行21          poolx.apply_async(func=run11,),callback=Cal) 并行并加入执行完毕的回调函数22          poolx.apply(func=run11,)) #串行23 24      等待并关闭进程25      poolx.close()26      poolx.join()-----  完毕  -----")
协程:

单线程实现高并发

安装:pip3 install gevent

手动切换:

 greenlet gfunx1():    ----gfunx1---)    g2.switch() 手动切换到 gfunx2 中 gfunx2():    ---gfunx2----声明两个协程g1=greenlet.greenlet(gfunx1)g2=greenlet.greenlet(gfunx2)g1.switch() 手动切换到 gfunx1 中

自动切换:

默认是先运行完gfunx1然后再运行gfunx2,但当遇到IO *** 作则会自动跳转到另一个协程工作,以此实现在协程中遇到IO就互相切换执行的效果

 gevent gfunx1(): 4     ---- gfunx1 --- 5     gevent.sleep(3) 模拟 IO  *** 作为 3 秒,但使用time.sleep(x)则会进行阻塞**** 三秒io *** 作结束 ****** gfunx2(): 9     ---- gfunx2 ----12 开启两个协程gevent.joinall([    gevent.spawn(gfunx1),15     gevent.spawn(gfunx2),1)">16 ])
自动切换进阶:
将一系列阻塞 *** 作让协程识别为IO *** 作

from gevent  monkey将所有的阻塞 *** 作(如:网络,延时,文件等)都视为gevent可捕获的IO阻塞 *** 作根据库作者提示:此句最好放在其它库import之前,否则会出现警告 5 monkey.patch_all() 6  7  requests12     res=requests.get(https://img2018.cnblogs.com/blog/1485202/201811/1485202-20181116215233782-319594948.png13     open(ww.jpgwb").write(res.content) 以二进制写文件**** 网络 *** 作结束 ******18     time.sleep(3) 延时 *** 作也已视为IO阻塞*** 延时 *** 作结束 3s ***20 21  gfunx3(varx):---- gfunx3 ----23     time.sleep(1*** 延时 *** 作结束 1s ***25 27  开启三个协程28 29 30 31     gevent.spawn(gfunx3,1)">33333") 传递参数32  ])
总结

以上是内存溢出为你收集整理的Python档案袋( 进程与协程 )全部内容,希望文章能够帮你解决Python档案袋( 进程与协程 )所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存