同步异步与回调函数
时间:2019-12-13
本文章向大家介绍同步异步与回调函数,主要包括同步异步与回调函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
同步异步
1,同步
同步是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那个这个进程会一直等待下去,直到收到返回信息,才继续执行下去
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import os, random def task(i): print(f'{os.getpid()}开始了任务') time.sleep(random.randint(1,3)) print(f'{os.getpid()}结束了任务') return i if __name__ == '__main__': p = ProcessPoolExecutor() for i in range(10): obj = p.submit(task, i) print(obj.result()) p.shutdown(wait=True)
2,异步
是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程 的状态,当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import os import requests def task(i): print(f'{os.getpid()}开始了任务') time.sleep(random.randint(1,3)) print(f'{os.getpid()}结束了任务') return i if __name__ == '__main__': p = ThreadPoolExecutor() li = [] for i in range(10): obj = p.submit(task, i) li.append(obj) p.shutdown() for i in li: print(i.result()) ##################map函数的应用 if __name__ == '__main__': p = ProcessPoolExecutor() obj = p.map(task, range(10)) p.shutdown() print(list(obj))
回调函数
进程池与线程池的区别
- 进程池:主进程调用回调函数,得到任务结果
- 线程池:空闲线程调用回调函数,得到任务结果
回调函数什么时候用,回调函数在爬虫中最常用,造数据的非常耗时,处理数据的时候不耗时
回调函数的场景:进程池中任何一个任务一旦完成了,就立即告知主进程,主进程则调用一个函数去处理结果,该函数即回调函数。
我们可以把耗时间即阻塞的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程就在执行回调函数时就省去了IO阻塞的过程,直接拿到任务单结果
异步加回调函数处理网站
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import os import requests def url_page(url): response = requests.get(url) print(f'{os.getpid()} is getting {url}') if response.status_code == 200: return {"url": url, "text": response.text} def parse_page(res): res = res.result() with open('url.text', 'a', encoding='utf-8') as f: parse_res = f"url:{res['url']} size:{len(res['text'])}" f.write(parse_res+'\n') if __name__ == '__main__': p = ProcessPoolExecutor(4) # p = ThreadPoolExecutor(4) l = [ 'http://www.baidu.com', 'http://www.baidu.com', 'http://www.baidu.com', 'http://www.baidu.com', 'http://www.JD.com', 'http://www.JD.com', 'http://www.JD.com', 'http://www.JD.com', 'http://www.JD.com', 'http://www.JD.com', ] for i in l: # res = p.submit(url_page, i).add_done_callback(parse_page) ret = p.submit(url_page, i) ret.add_done_callback(parse_page) p.shutdown()
原文地址:https://www.cnblogs.com/daviddd/p/12034432.html
- 未来3年,人工智能如何影响法律行业?5位权威专家给出趋势
- Java 常见内存溢出异常与代码实现
- nginx限制上传大小和超时时间设置说明/php限制上传大小
- Unity Application Block 1.2 学习笔记
- 苹果首个自动驾驶专利到底有什么来头?
- 围棋遇上互联网:科技打开优秀传统文化未来之门
- 神经网络开始放飞自我!都是因为架构搜索新算法
- 浏览器缓存问题的解决
- nginx下目录浏览及其验证功能、版本隐藏等配置记录
- Sqlite的多表连接更新
- Enterprise Library 4.1学习笔记6----加密应用程序块
- 浅谈数据库主键策略
- nginx应用总结(1)--基础认识和应用配置
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2.3 Python语言基础
- 开发需求
- Linux系统组建SVN服务器
- 面向对象学习
- 常用模块
- 代理错误[WinError 10061]
- Linux系统JDK+Tomcat环境安装布署过程
- Python version 3.6 required, which was not found in the registry错误解决
- LNMP架构应用实战——Nginx服务介绍与安装
- 使用tidylib解决不规则网页问题
- LNMP架构应用实战——Nginx服务配置文件介绍
- Mac Sublime Text3快捷键
- Linux系统shell脚本编程——生产实战案例
- 学习python第一天总纲
- 学习python第二天数据库day1