对大部分语言来说,经常用到并发来处理一些情况。比如必须要多次查询数据库,多次请求API,python内置的gevent就很简单好用。传参,获取返回值,捕获协程的错误都很方便。
直接上例子:
import gevent as geventclass MyError(Exception):def __init__(self, msg):self.msg = msgdef __str__(self):return self.msgdef cor_1(parm):print(parm)# 有可能需要获取协程的返回值return parmdef cor_2():try:# 协程出现错误raise MyError('类型错误')except Exception as e:raise edef cor_3(parm):print(parm)return parmif __name__ == '__main__':jobs = []jobs.append(gevent.spawn(cor_1, 1))jobs.append(gevent.spawn(cor_2))jobs.append(gevent.spawn(cor_3, 3))# raise_error 是否排除协程中的异常 True抛出协程中的异常,False不抛出协程中的异常# 阻塞等待所有协程执行完gevent.joinall(jobs, raise_error=False)# raise_error=True直接捕获协程的错误# try:# gevent.joinall(jobs, raise_error=True)# except Exception as e:# print("协程有错误"+str(e))for i, g in enumerate(jobs):# 判断每个协程的执行情况if g.successful() is False:# 出现错误 raise_error=False执行完后获取协程的错误print(g.exception)else:# 获取返回值print(g.value)
两个文档地址:
gevent 并发框架
gevent – common functions — gevent 21.12.1.dev0 documentation
gerrlet 伪协程
Greenlet Objects — gevent 21.12.1.dev0 documentation