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
解析执行的过程
- 主线程,创建了进程池pool=Pool(3), 然后创建一个进程他的target 是task ,子进程开始执行task 任务
- 主线程继续走下边的,也就是sleep 5s ,目的就是等子进程执行完,如何子进程没有结束主进程结束了,也会直接结束子进程
- 子进程开始执行 task 任务, 结束后有个返回值 会传递给 callback 函数, call back 函数通过打印的pid 知道是主进程
- 执行callback 函数 和继续sleep(5) 如果解说 程序就结束了。
为了验证, 主进程是不等子进程的,修改如下:
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