python_高级进阶(4)同步_异步_回调函数_阻塞

阻塞

阻塞: 程序运行时,遇到了IO,程序挂起,cpu被切走.

非阻塞

非阻塞: 程序没有遇到IO,程序遇到IO但是我通过某种手段,让cpu强行运行我的程序.

? #同步:
提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我在提交下一个#? #异步:
一次提交多个任务,然后我就直接执行下一行代码.

收取结果 :

1将所有的任务的结果统一回收. 2. 完成一个任务,返回一个结果.
给三个人发布任务:
同步: 先告知第一个人完成写书的任务,我从原地等待,等他两天之后完成了,
告诉完事了,我在发布下一个任务......
异步: 直接将三个任务告知三个人,我就忙我的我,直到三个人完成之后,告知我.

方式一: 异步调用,统一回收结果.
# 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()
#     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('===主')
# 统一回收结果: 我不能马上收到任何一个已经完成的任务的返回值,
我只能等到所有的任务全部结束统一回收.

异步调用

步调用返回值如何接收?
# 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()
#     for i in range(10):
#         pool.submit(task,i)
#
#     pool.shutdown(wait=True)
#     # shutdown: 让我的主进程等待进程池中所有的子进程都结束任务之后,在执行. 有点类似于join.
#     # shutdown: 在上一个进程池没有完成所有的任务之前,不允许添加新的任务.
#     # 一个任务是通过一个函数实现的,任务完成了他的返回值就是函数的返回值.
#     print('===主'

同步调用

# 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()
#     for i in range(10):
#         obj = pool.submit(task,i)
#         # obj是一个动态对象,返回的当前的对象的状态,有可能运行中,可能(就绪阻塞),还可能是结束了.
#         # obj.result() 必须等到这个任务完成后,返回了结果之后,在执行下一个任务.
#         print(f'任务结果:{obj.result()}')
#
#     pool.shutdown(wait=True)
#     # shutdown: 让我的主进程等待进程池中所有的子进程都结束任务之后,在执行. 有点类似与join.
#     # shutdown: 在上一个进程池没有完成所有的任务之前,不允许添加新的任务.
#     # 一个任务是通过一个函数实现的,任务完成了他的返回值就是函数的返回值.
#     print('===主')

异步调用+回调函数


# 版本一:
# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# import time
# import random
# import os
# import requests
# def task(url):
#     '''模拟的就是爬取多个源代码 一定有IO操作'''
#     ret = requests.get(url)
#     if ret.status_code == 200:
#         return ret.text
# def parse(content):
#     '''模拟对数据进行分析 一般没有IO'''
#     return len(content)
# 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.luffycity.com/',
#         '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)
#     obj_list = []
#     for url in url_list:
#         obj = pool.submit(task,url)
#         obj_list.append(obj)
#     pool.shutdown(wait=True)
#     for res in obj_list:
#         print(parse(res.result()))
# # '''
# parse(res.result())
# parse(res.result())
# parse(res.result())
# parse(res.result())
# parse(res.result())
# parse(res.result())
# parse(res.result())
# parse(res.result())
# parse(res.result())
# print('===主')
# 版本一:
#     1. 异步发出10个任务,并发的执行,但是统一的接收所有的任务的返回值.(效率低,不能实时的获取结果)
#     2. 分析结果流程是串行,影响效率.

版本二: 针对版本一的缺点2,改进,让串行编程并发或者并行.
# from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
# import time
# import random
# import os
# import requests
#
# def task(url):
#     '''模拟的就是爬取多个源代码 一定有IO操作'''
#     ret = requests.get(url)
#     if ret.status_code == 200:
#         return parse(ret.text)
# def parse(content):
#     '''模拟对数据进行分析 一般没有IO'''
#     return len(content)
# 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.luffycity.com/',
#         '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)
#     obj_list = []
#     for url in url_list:
#         obj = pool.submit(task, url)
#         obj_list.append(obj)
#     '''
#     # 1 在开一个线程进程池,并发并行的处理. 再开一个线程进程池,开销大.
#     # 2 将原来的任务扩大,
#     版本一:
#         线程池设置4个线程, 异步发起10个任务,每个任务是通过网页获取源码, 并发执行,
#         最后统一用列表回收10个任务, 串行着分析源码.
#     版本二:
#         线程池设置4个线程, 异步发起10个任务,每个任务是通过网页获取源码+数据分析, 并发执行,
#         最后将所有的结果展示出来.
#         耦合性增强了.
#         并发执行任务,此任务最好是IO阻塞,才能发挥最大的效果
#     '''
#     pool.shutdown(wait=True)
#     for res in obj_list:  # [obj1, obj2,obj3....obj10]
#         print(res.result())

版本三:
# 基于 异步调用回收所有任务的结果我要做到实时回收结果,
# 并发执行任务每个任务只是处理IO阻塞的,不能增加新得功能.
# 异步调用 + 回调函数
# from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
# import time
# import random
# import os
# import requests
#
# def task(url):
#     '''模拟的就是爬取多个源代码 一定有IO操作'''
#     ret = requests.get(url)
#     if ret.status_code == 200:
#         return ret.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.luffycity.com/',
#         '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)
#     for url in url_list:
#         obj = pool.submit(task, url)
#         obj.add_done_callback(parse)
#
#     '''
#     线程池设置4个线程, 异步发起10个任务,每个任务是通过网页获取源码, 并发执行,
#     当一个任务完成之后,将parse这个分析代码的任务交由剩余的空闲的线程去执行,你这个线程继续去处理其他任务.
#     如果进程池+回调: 回调函数由主进程去执行.
#     如果线程池+回调: 回到函数由空闲的线程去执行.

# 异步 回调是一回事儿?
# 异步站在发布任务的角度,
# 站在接收结果的角度: 回调函数 按顺序接收每个任务的结果,进行下一步处理.

# 异步 + 回调:
# 异步处理的IO类型.
# 回调处理非IO

原文地址:https://www.cnblogs.com/SkyRabbit/p/11419278.html

时间: 2024-08-04 15:30:58

python_高级进阶(4)同步_异步_回调函数_阻塞的相关文章

同步和异步以及回调函数

一.同步 <script type="text/javascript"> for(var i=0; i<100; i++){ //先执行循环* ,在输出222 console.log('*') } console.log(222); </script> 二.异步 <script type="text/javascript"> setInterval(function(){ //先输出111,再输出定时* console.lo

javaScript中的同步,异步与回调函数

for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); }, 1000); } console.log(i); 输出结果: //输出 5 i: 5 i: 5 i: 5 i: 5 i: 5 记住我们的口诀,同步=>异步=>回调 1.for循环和循环体外部的console是同步的,所以先执行for循环,再执行外部的console.log.(同步优先) 2.for循环里面有一个setTimeout回

同步、异步、回调函数面试经典问题

1.首先需要记住的是这么一句话 同步先行==>异步靠边=>回调垫底 <script> var a = new Promise(function () { console.log(1); setTimeout(() => consoel.log(2), 0); console.log(3); console.log(4); resolve(true); }) a.then(v => { console.log(8) }); var b = new Promise(func

Python 中的进程、线程、协程、同步、异步、回调

进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享<Python中的进程.线程.协程.同步.异步.回调>. 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说明一点术语.当我们说"上下文"的时候,指的是程序在执行中的一个状态.通常我们会用调用栈来表示这个状

同步异步与回调函数

同步异步 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'{o

[Effective JavaScript 笔记]第67条:绝不要同步地调用异步的回调函数

设想有downloadAsync函数的一种变种,它持有一个缓存(实现为一个Dict)来避免多次下载同一个文件.在文件已经被缓存的情况下,立即调用回调函数是最优选择. var cache=new Dict(); function downloadCachingAsync(url,onsuccess,onerror){ if(cache.has(url)){ onsuccess(cache.get(url)); return; } return downloadAsync(url,function(

node.js在windows下的学习笔记(4)---同步,异步,回调的概念

Node.js是使用事件驱动的,非阻塞的I/O模型,用于构建快速的,可扩展的网络应用程序. Node.js想解决的问题是:处理输入,输入,高并发 1.阻塞与非阻塞 阻塞也叫同步,是指每一次执行一个操作,在这个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上. 阻塞就相当于你在超市里面买东西,结账,在排队,如果前面的人没买单,你就不能买,一定要等前面的人先执行完其操作才可以 非阻塞就相当于你在外婆家取号,然后就可以去干别的事情了,等轮到我们的时候,短信发到我们的手机上了,说轮到我们了,这样我

Node.js 回调函数 1) 阻塞 ,同步 2) 非阻塞 ,异步.

1.阻塞. 同步. 1) 读取的文件: input.txt 菜鸟教程官网地址:www.runoob.com 2) main.js 1 var fs = require("fs"); 2 3 //同步读取, 阻塞代码,按顺序执行的 4 var data = fs.readFileSync('input.txt'); 5 6 console.log(data); 7 console.log(data.toString()); 8 console.log("程序执行结束!"

【Javascript】Js同步异步以及回调函数

一.前言 今天查看了requireJs方面的知识,看着看着就看到了JS中同步与异步操作的知识点,经过查阅了很多的资料,基本了解了JS的同步与异步的操作,其中涉及到的知识点如下: 什么时同步和异步? JS的是基于事件驱动的单线程语言,为啥会有异步操作这种多线程的操作??? 浏览器线程,浏览器内核线程间的合作? JS的异步操作都有哪些?它是如何工作的? 二.js单线程 JS的单线程 单线程的含义是js只能在一个线程上运行,也就是说,同一时间只能做一件事情,其他的任务则会放在任务队列里面排队等等js线