python 37 同步、异步调用
1. 阻塞与非阻塞
执行的角度:
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。
非阻塞:程序没有遇到IO阻塞,或者程序遇到IO,通过某种方式,让CPU强行运行程序。
2. 同步与异步
发布的角度:
同步调用:在发出一个任务时,自任务开始运行直到结束(可能遇到IO),只有返回一个返回值之后,才会发出下一个任务。
异步调用:一次发布多个任务,然后就直接执行下一行代码。不用等待结束。
shutdown:
- 让主进程等待进程池中所有的子进程都结束后,再执行。
2. 在上一个进程池没有完成所有的任务之前,不允许添加新任务。
一个任务是通过一个函数实现的,任务完成了,它的返回值就是函数的返回值。
2.1 异步调用
# 异步调用
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import time
import random
import os
def task(i):
print(f'{os.getpid()}开始任务')
time.sleep(random.randint(1,2))
print(f'{os.getpid()}任务结束')
return i
if __name__ == '__main__':
pool = ProcessPoolExecutor() # 4个进程
for i in range(10):
pool.submit(task, i)
pool.shutdown(wait=True)
print("===主")
2.2 同步调用
result() :将异步调用变成同步,必须等到任务完成,返回结果后,再执行下一个。能够接收返回值。
# 同步调用
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import time
import random
import os
def task(i):
print(f'{os.getpid()}开始任务')
time.sleep(random.randint(1,2))
print(f'{os.getpid()}任务结束')
return i
if __name__ == '__main__':
pool = ProcessPoolExecutor()
for i in range(10):
obj = pool.submit(task, i) # 动态对象,能够返回当前对象的状态, running、peeding、finishhed三种状态。
print(f'任务结果:{obj.result()}') # 将返回的结果打印
pool.shutdown(wait=True)
print("===主")
2.3 异步调用回收的第一种方式
统一回收结果,不能够马上接收任何一个返回值(实时)。
# 异步调用 接收返回值的第一种方式:
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time
import random
import os
def task(i):
print(f'{os.getpid()}开始任务')
time.sleep(random.randint(1,3))
print(f'{os.getpid()}任务结束')
return i
if __name__ == '__main__':
# 异步调用
pool = ProcessPoolExecutor() # 4个进程
l1 = []
for i in range(10):
obj = pool.submit(task,i)
l1.append(obj) # 将对象放入容器中。
pool.shutdown(wait=True)
print(l1)
for i in l1:
print(i.result())
print('===主')
3. 异步调用+回调函数
3.1 requests模块
浏览器原理:向服务端发送一个请求,服务端验证,如果是正确的,会返回一个文件;浏览器接收到文件,将文件里面的代码渲染后展示到屏幕上。
爬虫:
1.利用代码模拟浏览器发送伪装的请求,会得到一堆源代码;
2.对源代码进行数据清洗得到想要的数据。
3.2 异步调用回收的第二种方式
要求:
- 要做到实时回收结果,第一种方式没有实时。
- 并发执行任务,只是用来处理IO阻塞的(爬虫也是阻塞),不能增加新的功能(清洗数据功能),否则容易造成耦合。
解决:增加回调函数。
回调函数:按顺序接收每个任务的结果,进行下一步的数据处理。 对象. add_done_callback(方法名)
异步处理IO类型,回调函数处理非IO,才可用异步 + 调用。
线程 + 回调:将处理的数据交给空闲的线程去执行;
进程 + 回调:将处理的数据交给主进程去执行。
from concurrent.futurse import ThreadPoolExecutor
import requests
def task(url):
"""模拟爬取多个源代码,有IO操作"""
response = requests.get(url)
if response.status_code == 200:
return response.text
def parse(obj):
"""模拟对数据进行分析,一般没有IO"""
print(len(obj.result()))
if __name__ == '__main__':
url_list = [
'http://www.baidu.com',
'http://www.JD.com',
'http://www.JD.com',
'http://www.JD.com',
'http://www.taobao.com',
'https://www.cnblogs.com/jin-xin/articles/7459977.html',
'https://www.cnblogs.com/yzm1017/',
'https://www.cnblogs.com/jin-xin/articles/9811379.html',
'https://www.cnblogs.com/jin-xin/articles/11245654.html',
'https://www.sina.com.cn/']
pool = ThreadPoolExecutor(4) # 4个线程
for url in url_list:
obj = pool.submit(task, url)
obj.add_done_callback(parse) # 回调函数
"""
线程池设置4个线程, 异步发起10个任务,每个任务是通过网页获取源码, 并发执行,
当一个任务完成之后,将parse这个分析代码的任务交由剩余的空闲的线程去执行,你这个线程继续去处理其他任务。
"""
"""
2381
99306
99306
2708
21634
47067
99306
143930
571258
48110
"""
python 37 同步、异步调用的更多相关文章
- dubbo同步/异步调用的方式
我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用(默认) 异步调用 参数回调 事件通知 同步 ...
- .Net下的MSMQ(微软消息队列)的同步异步调用
一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列 和电子邮件有着很多相似处,他们都包含多个属性, ...
- pythonのgevent同步异步区别
#!/usr/bin/env python from urllib import request import gevent from gevent import monkey import time ...
- jQuery同步/异步调用后台方法
$.ajax({ type: "Post", url: "UserManage.aspx/SubmitPage",//页面/方法名 data: "{' ...
- ajax 同步异步调用
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
- python 并发编程 同步调用和异步调用 回调函数
提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...
- C#:Func的同步、异步调用(转)
实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Add方法: 1 public class ...
- 似是而非的JS - 异步调用可以转化为同步调用吗?
源起 小飞是一名刚入行前端不久的新人,因为进到了某个大公司,俨然成为了学弟学妹眼中'大神',大家遇到js问题都喜欢问他,这不,此时他的qq弹出了这样一条消息 "hi,大神在吗?我有个问题想问 ...
随机推荐
- [剑指offer] 23. 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 解法一:递归 二叉搜索树,后序遍历的数组中 ...
- [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
原题 题意: 根据先序和中序得到二叉树(假设无重复数字) 思路: 先手写一次转换过程,得到思路. 即从先序中遍历每个元素,(创建一个全局索引,指向当前遍历到的元素)在中序中找到该元素作为当前的root ...
- 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)
目录 一. 模型的制作 1.1 生成字体模型 1.2 多表面贴图 二. 镜头及动画 三. 大作业总结 示例代码托管在:http://www.github.com/dashnowords/blogs 博 ...
- CF392BTower of Hanoi(记忆化搜索)
CF392B 记搜好题 预处理 题目给出了将一个盘从x移到y的代价(代码中为a[][]),当我们知道这并不是最优的 就像最短路floyd一样松弛操作预处理得到两柱之间最优值b[][] for(int ...
- Flutter学习笔记(11)--文本组件、图标及按钮组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...
- Sting和Long类型转换
java String 转 Long 两种方法区别Long.ValueOf("String")返回Long包装类型包装类型: Byte,Integer,Short,Long,Boo ...
- idea新建javaweb工程
最近尝试了idea的使用,将idea建立javaweb工程的步骤记录下来 1.方框里边是重点 2.next后输入工程文件名点击finish 3.如图看到项目文件夹里边没有WEB-INF文件夹及里边的w ...
- 神奇的 SQL 之 CASE表达式,妙用多多 !
前言 历史考试选择题:黄花岗起义第一枪谁开的? A宋教仁 B孙中山 C黄兴 D徐锡麟,考生选C. 又看第二题:黄花岗起义第二枪谁开的? 考生傻了,就选了个B. 接着看第三题:黄花岗起义中,第三枪谁开的 ...
- vim中 E212:无法打开并写入文件的解决办法
很简单,就是用管理员身份打开这个文件 不要被网上的一些乱七八糟的迷惑了 sudo vim ....... 解决了问题请点个赞,谢谢
- 工作笔记--对接三方Http接口遇到的问题
在使用 HttpClient 4.4 调用第三方 http api 时遇到了很多问题,还好最后都解决了,记录一下遇到的问题及解决办法,希望对同样有此问题的你有所帮助. 环境说明 首先说明一点是,对方的 ...