python coroutine vs multiprocessing vs multithreading

指导意见

如果是计算密集型的任务,直接用multi-processing。计算密集,计算量大故需要并行计算,需要的是 parallelization。(一家人一起剥花生种子剥得快,把所有CPU都用上。)

如果是IO密集型的任务,可以用coroutine。IO密集,等待较多故需要并发处理,需要的是 concurrenncy。(一个人在等着水开的空档切菜,充分利用一个CPU。)

因为GIL的存在,multithreading不适合用于解决计算密集型任务。而IO密集型任务又被coroutine解决得很好。不知道multithreading还能干啥。

协程与异步IO

async def fetch_and_parse(url):
    data = db.fetch("select ...")  # IO intensive
    return parse(data) # CPU intensive

async def 用于指定函数是异步执行的。直接调用函数f只能返回一个coroutine object,而非执行结果,函数体代码并未执行。要执行,在async def内可以用await同步化。在函数外部,要么用low level接口将coroutine object提交到一个event loop中等待完成。要么用high level接口asyncio.run直接调度coroutine object至完成。

另外,asyncio.create_task可将coroutine object转化为task,立即调度执行,返回awaitable。想要结果得自己处理。

asyncio.gather(a,b,c..)可以一次调度多个coroutine object,await gather(...)等待他们都执行完毕,返回执行的结果。

新的python3.11中有task group的概念,类似gather可以使用async with语法同时调度和等待多个task。

await一个coroutine object的作用是同步化,等待该coroutine object执行完毕,拿到结果给到调用方。

await只能在async def中使用,以保证最终会绑定event loop。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值