获取 异步执行调用的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取 异步执行调用的结果相关的知识,希望对你有一定的参考价值。

参考技术A 在我的 多进程 multiprocessing.Process 有同学留言 如何获取 子进程处理的结果 。这里开一篇博客讲解。

其实这里涉及到 同步 与 异步 的概念。对于多线程/进程 而言,它们其实是一种 异步 操作。

对于异步操作,分为 不需要获取异步结果 与 需要获取异步结果 ,我们应该尽量设计成第一种方式。

对于大部分的 多线程/进程 | 异步操作 [ 后面统称为异步操作 ],我们应尽量在 异步操作 中完成所有任务,这是可以通过设计控制的。

举例几个场景:

2)多个 线程/进程 | 异步 有关联的操作。
多线程 / 进程有一个经典的入门案例:生产者与消费者模式。

按照同步的思想,应该是[ 在主控程序中 ]通过生产者获取数据,然后调用消费者去消耗数据。

但是在 多线程 |进程 中,我们应该在子线程中完成任务。所以应该这样设计:
在 生产者 与 消费者 中分别传入一个容器,他们分别在容器中 put , get 数据

小结,对于大部分的 IO 操作,使用 多线程/进程 可以大大的减少程序执行时间,在设计 多线程/进程 时,我们应尽量将任务在 子线程/进程 中完成。

作为一个成熟的子线程/进程,你应该能够独立完成工作。包含数据处理,存储,异常等待。

一个子线程处理的任务量可大可小。我们可以通过一个子线程发送邮件,对服务器而言,可以通过一个子线程去处理用户请求,我们后端的所以操作都是在这个子线程中完成。

虽然上面讲了很多的不需要获取异步结果的案例。当我们也有很多必须要获取异步结果的场景。

比如我们将一个很大的计算分成多个小计算,然后对这些小计算的结果汇总。
比如做大文件上传,将大文件拆分成小文件,并获取上传成功的小文件标示 ...

对于需要获取异步结果场景, python 有单独的 多线程/进程执行器 ,分别是
ProcessPoolExecutor , ThreadPoolExecutor

同步与异步,阻塞与非阻塞

同步与异步

如果在一个方法中调用另一个方法,当我们在讨论同步还是异步时,其实讨论的是被调用方的行为。

  • 当被调用方在执行完逻辑之后才返回执行结果给调用方,也就是说调用方一直等待被调用方执行结束就是同步。
  • 当被调用方在被调用之后没有计算出执行结果就立即返回就是异步。

所以被调用方,不立即返回就是同步,立即返回就是异步。

如果被调用方是异步,就必须提供某种方式让调用方知道它执行完了,以及执行的结果:

  • 调用方提供回调方法给被调用方,被调用方在执行完了之后调用回调方法并传入执行结果。
  • 被调用方尽管不返回执行结果,但会返回一个对象,调用方可以通过调用该对象获取/控制被调用方的执行进度。

阻塞与非阻塞

如果一个方法调用另一个方法,当我们在讨论是阻塞还是非阻塞时,其实讨论的是调用方的行为。

  • 当被调用方返回执行结果之前,调用方什么都不做,一直等待被调用方,那就是阻塞。
  • 方被调用方返回执行结果之前,调用方去执行其它的逻辑,那就是非阻塞。

以上是关于获取 异步执行调用的结果的主要内容,如果未能解决你的问题,请参考以下文章

Ajax异步调用的顺序执行

异步回调函数

同步与异步,阻塞与非阻塞

VB调用SQL存储过程异步执行问题

python实现异步调用函数执行

使用celery的backend异步获取结果