进程池/线程池/协程

2021-07-03 17:06

阅读:493

标签:get   app   代码   计算   ret   imp   turn   暂停   异步   

导入进程池线程池模块@@

from concurrent import ProcessPoolExecutor,ThreadPoolExecutor

同步提交,异步提交@@

from concurrent import ProcessPoolExecutor,ThreadPoolExecutor
import os
def foo(name):
print(‘进程%s,进程号为%s‘%(name,os.getpid()))
return os.getpid()

if __nmae__==‘__main__‘:
pool=ProcessPoolExecutor(5)
lis=[]
for i in range(10):
future=pool.submit(foo,i)#异步提交,提交完一个任务后,直接执行下一行代码,我们可以把生成的future对象保存在一个列表中,等到进程池内所有任务运行完再用对象调用result方法获得任务返回的结果
#res=pool.submit(foo,i).result()同步提交:提交完一个任务后,就在原地等任务的执行结果,拿到执行结果后,再执行下一行代码,会导致任务是串行执行的
#print(res)
lis.append(future)
pool.shutdown(wait=True)#shutdown代表的是关闭进程池的入口,不让新的任务往进程池里提交,wait代表的是等待进程池内所有的任务执行完毕
for i in (lis):
print(i.result())

print(‘主进程‘)

回调函数@@

from concurrent.future import ProcessPoolExecutor,ThreadPoolExecutor

def foo(i):
print(‘第%s进程进来了‘%s)

return i**2

def get(future):

print(future*2)


if __name__==‘__main__‘:
pool=ProcessPoolExecutor(5)
for i in range(10):
future=pool.submit(foo,i)
future.add_done_callback(get)#进程中在任务执行完毕后get会自动触发,获得的参数是future,执行get函数的是主进程,而在线程中则是由空闲的线程来执行
pool.shutdown(wait=True)

print(‘zhu‘)

并发编程之协程@@

并发的本质:切换+保存状态
cpu正在运行一个任务,会有两种情况会切走取执行其他的任务,一种是该任务遇到阻塞,另一种情况是该任务的计算时间过长或者有其他级别更高的程序替代了他
协程的本质就是在一个单线程下,用户自己控制一个任务遇到io就切换到其他任务去执行,切换的时候需要把之前的任务状态保存下来,以便于重新运行此任务时,可以从暂停的位子继续运行


协程介绍@@

协程是单线程下的并发,又称为微线程,纤程,协程是一种用户态的轻量级线程,由用户自己控制调度

安装gevent@@
pip3 install gevent

from gevent import monkey;monkey.patch_all#需要使用gevent模块必须把这行代码放在最前边,用来检测协程的阻塞状态
from gevent import spawn#spawn相当于提交

import time

def foo(name):
print(‘%s is running‘%name)
time.sleep(2)
print(‘%s is down‘%name)


def var(name):
print(‘%s is running‘%name)
time.sleep(2)
print(‘%s is down‘%name)


g1=spawn(foo,‘egon‘)
g2=spawn(foo,‘lili‘)
g1.join()
g2.join()
print(‘zhu‘)

 

 

 

 


 

进程池/线程池/协程

标签:get   app   代码   计算   ret   imp   turn   暂停   异步   

原文地址:https://www.cnblogs.com/fushaunglin/p/9621973.html


评论


亲,登录后才可以留言!