1. 阻塞与非阻塞

执行的角度:

​ 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。

​ 非阻塞:程序没有遇到IO阻塞,或者程序遇到IO,通过某种方式,让CPU强行运行程序。

2. 同步与异步

发布的角度:

​ 同步调用:在发出一个任务时,自任务开始运行直到结束(可能遇到IO),只有返回一个返回值之后,才会发出下一个任务。

​ 异步调用:一次发布多个任务,然后就直接执行下一行代码。不用等待结束。

shutdown:

  1. 让主进程等待进程池中所有的子进程都结束后,再执行。

    2. 在上一个进程池没有完成所有的任务之前,不允许添加新任务。

一个任务是通过一个函数实现的,任务完成了,它的返回值就是函数的返回值。

2.1 异步调用

  1. # 异步调用
  2. from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
  3. import time
  4. import random
  5. import os
  6. def task(i):
  7. print(f'{os.getpid()}开始任务')
  8. time.sleep(random.randint(1,2))
  9. print(f'{os.getpid()}任务结束')
  10. return i
  11. if __name__ == '__main__':
  12. pool = ProcessPoolExecutor() # 4个进程
  13. for i in range(10):
  14. pool.submit(task, i)
  15. pool.shutdown(wait=True)
  16. print("===主")

2.2 同步调用

result() :将异步调用变成同步,必须等到任务完成,返回结果后,再执行下一个。能够接收返回值。

  1. # 同步调用
  2. from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
  3. import time
  4. import random
  5. import os
  6. def task(i):
  7. print(f'{os.getpid()}开始任务')
  8. time.sleep(random.randint(1,2))
  9. print(f'{os.getpid()}任务结束')
  10. return i
  11. if __name__ == '__main__':
  12. pool = ProcessPoolExecutor()
  13. for i in range(10):
  14. obj = pool.submit(task, i) # 动态对象,能够返回当前对象的状态, running、peeding、finishhed三种状态。
  15. print(f'任务结果:{obj.result()}') # 将返回的结果打印
  16. pool.shutdown(wait=True)
  17. print("===主")

2.3 异步调用回收的第一种方式

统一回收结果,不能够马上接收任何一个返回值(实时)。

  1. # 异步调用 接收返回值的第一种方式:
  2. from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
  3. import time
  4. import random
  5. import os
  6. def task(i):
  7. print(f'{os.getpid()}开始任务')
  8. time.sleep(random.randint(1,3))
  9. print(f'{os.getpid()}任务结束')
  10. return i
  11. if __name__ == '__main__':
  12. # 异步调用
  13. pool = ProcessPoolExecutor() # 4个进程
  14. l1 = []
  15. for i in range(10):
  16. obj = pool.submit(task,i)
  17. l1.append(obj) # 将对象放入容器中。
  18. pool.shutdown(wait=True)
  19. print(l1)
  20. for i in l1:
  21. print(i.result())
  22. print('===主')

3. 异步调用+回调函数

3.1 requests模块

​ 浏览器原理:向服务端发送一个请求,服务端验证,如果是正确的,会返回一个文件;浏览器接收到文件,将文件里面的代码渲染后展示到屏幕上。

爬虫:

​ 1.利用代码模拟浏览器发送伪装的请求,会得到一堆源代码;

​ 2.对源代码进行数据清洗得到想要的数据。

3.2 异步调用回收的第二种方式

要求:

  1. 要做到实时回收结果,第一种方式没有实时。
  2. 并发执行任务,只是用来处理IO阻塞的(爬虫也是阻塞),不能增加新的功能(清洗数据功能),否则容易造成耦合。

解决:增加回调函数。

回调函数:按顺序接收每个任务的结果,进行下一步的数据处理。 对象. add_done_callback(方法名)

异步处理IO类型,回调函数处理非IO,才可用异步 + 调用。

线程 + 回调:将处理的数据交给空闲的线程去执行;

进程 + 回调:将处理的数据交给主进程去执行。

  1. from concurrent.futurse import ThreadPoolExecutor
  2. import requests
  3. def task(url):
  4. """模拟爬取多个源代码,有IO操作"""
  5. response = requests.get(url)
  6. if response.status_code == 200:
  7. return response.text
  8. def parse(obj):
  9. """模拟对数据进行分析,一般没有IO"""
  10. print(len(obj.result()))
  11. if __name__ == '__main__':
  12. url_list = [
  13. 'http://www.baidu.com',
  14. 'http://www.JD.com',
  15. 'http://www.JD.com',
  16. 'http://www.JD.com',
  17. 'http://www.taobao.com',
  18. 'https://www.cnblogs.com/jin-xin/articles/7459977.html',
  19. 'https://www.cnblogs.com/yzm1017/',
  20. 'https://www.cnblogs.com/jin-xin/articles/9811379.html',
  21. 'https://www.cnblogs.com/jin-xin/articles/11245654.html',
  22. 'https://www.sina.com.cn/']
  23. pool = ThreadPoolExecutor(4) # 4个线程
  24. for url in url_list:
  25. obj = pool.submit(task, url)
  26. obj.add_done_callback(parse) # 回调函数
  27. """
  28. 线程池设置4个线程, 异步发起10个任务,每个任务是通过网页获取源码, 并发执行,
  29. 当一个任务完成之后,将parse这个分析代码的任务交由剩余的空闲的线程去执行,你这个线程继续去处理其他任务。
  30. """
  31. """
  32. 2381
  33. 99306
  34. 99306
  35. 2708
  36. 21634
  37. 47067
  38. 99306
  39. 143930
  40. 571258
  41. 48110
  42. """

python 37 同步、异步调用的更多相关文章

  1. dubbo同步/异步调用的方式

    我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用(默认) 异步调用 参数回调 事件通知 同步 ...

  2. .Net下的MSMQ(微软消息队列)的同步异步调用

    一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列 和电子邮件有着很多相似处,他们都包含多个属性, ...

  3. pythonのgevent同步异步区别

    #!/usr/bin/env python from urllib import request import gevent from gevent import monkey import time ...

  4. jQuery同步/异步调用后台方法

    $.ajax({ type: "Post", url: "UserManage.aspx/SubmitPage",//页面/方法名 data: "{' ...

  5. ajax 同步异步调用

  6. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  7. python 并发编程 同步调用和异步调用 回调函数

    提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...

  8. C#:Func的同步、异步调用(转)

    实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Add方法: 1 public class ...

  9. 似是而非的JS - 异步调用可以转化为同步调用吗?

    源起 小飞是一名刚入行前端不久的新人,因为进到了某个大公司,俨然成为了学弟学妹眼中'大神',大家遇到js问题都喜欢问他,这不,此时他的qq弹出了这样一条消息 "hi,大神在吗?我有个问题想问 ...

随机推荐

  1. 跟着大彬读源码 - Redis 6 - 对象和数据类型(下)

    继续撸我们的对象和数据类型. 上节我们一起认识了字符串和列表,接下来还有哈希.集合和有序集合. 1 哈希对象 哈希对象的可选编码分别是:ziplist 和 hashtable. 1.1 ziplist ...

  2. Cocos2d-x 3.x中自定义渲染功能

    1.第一种方法针对的是整个图层的渲染         重写visit()函数,并且在visit()函数中直接向CommandQueue添加CustomCommand,设置好回调函数.          ...

  3. IIS应用程序池标识(程序池账户)ApplicationPoolIdentify

    IIS中应用程序池的运行账户(标识)有以下4个选项 LocalService 本地服务 LocalSystem 本地系统 NetWorkService 网络服务 ApplicationPoolIden ...

  4. mpvue的使用,包含axios、router的集成等完美结合小程序

    mpvue开发微信小程序框架的使用注意事项: 1.路由跳转,引用mpvue-router-patch 在main.js文件中引入控件:import MpvueRouterPatch from 'mpv ...

  5. java中代码的注释和快捷

    添加必要的注释,对一个有责任心.有道德模范的前端必须具备的好习惯, 可以大大提高代码的可维护性.可读性. java代码注释快捷键:ctrl+shift+/首先熟悉一下html.css.js的注释的写法 ...

  6. 机器学习经典分类算法 —— k-近邻算法(附python实现代码及数据集)

    目录 工作原理 python实现 算法实战 约会对象好感度预测 故事背景 准备数据:从文本文件中解析数据 分析数据:使用Matplotlib创建散点图 准备数据:归一化数值 测试算法:作为完整程序验证 ...

  7. 细说RESTFul API之版本管理

    目录 接口实现版本管理的意义 如何实现接口的版本管理 项目实战 接口实现版本管理的意义 API版本管理的重要性不言而喻,对于API的设计者和使用者而言,版本管理都有着非常重要的意义. 首先,对于API ...

  8. Java 之MVC动态分页完美实现

    一个分页小技术有时也是让人挠头,在这里完全前端实现方式与Java的实现方式,我们提供给你完全的编码参考,希望能够帮到你哦(:) 内容导读 1.程序结构 2.JSP页面设计 3.分页主要编码 4.运行效 ...

  9. 安装使用xen虚拟化工具

    换了一家新公司,需要拿出一套虚拟化方案,就把业界的主流虚拟化技术划拉了一遍,给领导交了一份报告,具体的技术部分已经在之前的随笔里了,本篇文章主要介绍的是xen虚拟化工具的安装: Xen官方部署文档:h ...

  10. 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP

    一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...