欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python高级进阶_30_一分钟明白异步概念以及作用

程序员文章站 2022-05-14 19:37:03
...

经过和我们群里的讨论,最终一致认为这两个概念 应该如下理解:

同步调用:它是属于阻塞类型,
举个例子我去星巴克去喝咖啡, 我到地方了,我说要一杯加糖加奶的咖啡,服务员说了,你等会吧 , 我就什么都不做,就一直傻傻等,什么时候美女递过来了我才回去。
异步调用:它是属于非阻塞类型,
同样也是订购咖啡,服务员说了,你等会吧, 要是异步怎么处理呢, 就给服务员说了,我去看书,等你什么时候做好了,你告诉我下, 我一边看书 一边等, 这就是异步 。

通过两个情况比较,可以看出异步的优点就是 我在等子线程或者子进程的时候,不会扔掉我手里的活 ,而是一边等一边干我自己的活,达到了时间的充分利用,程序的运行速度提升了很多。

列举简单的例子,感受下异步的特点,

切记不要局限下边代码的形式,而是学会异步思想

import os,time
from  multiprocessing import Pool
def task():
    print("我的进程id是: %s,父id是%s"%(os.getpid(),os.getppid()))
    for i in range(4):
        time.sleep(1)
        print("---task id: %d---"%i)
    return "over"
def test(args):
    print("接受到的args为:%s"%args)
    print("test 方法的 id 是%s"%os.getpid())
if __name__=="__main__":
    pool=Pool(3)
    pool.apply_async(func=task,callback=test)   
    time.sleep(5)

打印的结果:
我的进程id是: 19132,父id是18796
—task id: 0—
—task id: 1—
—task id: 2—
—task id: 3—
接受到的args为:over
test 方法的 id 是18796

解析执行的过程

  1. 主线程,创建了进程池pool=Pool(3), 然后创建一个进程他的target 是task ,子进程开始执行task 任务
  2. 主线程继续走下边的,也就是sleep 5s ,目的就是等子进程执行完,如何子进程没有结束主进程结束了,也会直接结束子进程
  3. 子进程开始执行 task 任务, 结束后有个返回值 会传递给 callback 函数, call back 函数通过打印的pid 知道是主进程
  4. 执行callback 函数 和继续sleep(5) 如果解说 程序就结束了。

python高级进阶_30_一分钟明白异步概念以及作用

为了验证, 主进程是不等子进程的,修改如下:

if name==“main”:

pool=Pool(3)

pool.apply_async(func=task,callback=test)

time.sleep(1)  # 只是改主进程的等待时间 

打印结果如下:

我的进程id是: 16016,父id是672

Process finished with exit code 0

总结 原理为 它是 非阻塞类型

相关标签: python 异步