阻塞、非阻塞、同步与异步

阻塞、非阻塞、同步与异步

阻塞与非阻塞

进程运行的三种状态:运行、就绪、阻塞

阻塞和非阻塞:

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

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

提交任务的角度:

同步: 提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我在提交下一个任务.

异步:一次提交多个任务,然后我就直接执行下一行代码.

同步调用与异步调用

同步调用:

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time
import random
import osdef 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 osdef 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)print('===主')

异步调用获取结果的两种方式:

方式1:统一回收结果: 任务结束后对所有动态对象取结果,获取函数返回值

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time
import random
import osdef task(i):print(f'{os.getpid()}开始任务')time.sleep(random.randint(1,3))print(f'{os.getpid()}任务结束')return iif __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('===主')
# 结果:
12708开始任务
8632开始任务
1848开始任务
14544开始任务
10704开始任务
18776开始任务
18480开始任务
18548开始任务
13916开始任务
17144开始任务
1848任务结束
14544任务结束
18548任务结束
8632任务结束
10704任务结束
18480任务结束
13916任务结束
17144任务结束
12708任务结束
18776任务结束
[<Future at 0x232b4a377b8 state=finished returned int>, <Future at 0x232b4a82c88 state=finished returned int>, <Future at 0x232b4a82d30 state=finished returned int>, <Future at 0x232b4a82dd8 state=finished returned int>, <Future at 0x232b4a82e80 state=finished returned int>, <Future at 0x232b4a82f28 state=finished returned int>, <Future at 0x232b4a8d048 state=finished returned int>, <Future at 0x232b4a8d128 state=finished returned int>, <Future at 0x232b4a8d208 state=finished returned int>, <Future at 0x232b4a8d2e8 state=finished returned int>]
0
1
2
3
4
5
6
7
8
9
===主

方式2:异步调用+回调函数

异步调用+回调函数

requests模块:

浏览器工作原理: 服务端发送一个请求,服务端验证你的请求,如果正确,给你的浏览器返回一个文件,浏览器接收到文件,将文件里面的代码渲染成你看到的漂亮美丽的模样.

爬虫原理:

1. 利用代码模拟一个浏览器,进行浏览器的工作流程得到一堆源代码.

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

import requests
ret = requests.get('http://www.baidu.com')
if ret.status_code == 200:print(ret.text)

引入回调函数的三个过程:

版本1:

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import requestsdef task(url):content = requests.get(url)return content.textdef parse(obj):return len(obj.result())if __name__ == '__main__':pool = ThreadPoolExecutor(4)url_list = ['http://www.JD.com','http://www.JD.com', 'https://home.cnblogs.com/u/lifangzheng/','https://wizardforcel.gitbooks.io/gopl-zh/content/ch0/ch0-01.html', 'https://www.pypypy.cn/#/','https://www.liaoxuefeng.com/', 'https://home.cnblogs.com/u/lifangzheng/','https://home.cnblogs.com/u/lifangzheng/', 'https://gitee.com/clover16', 'https://gitee.com/clover16']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()))
# 版本一的两个缺陷:
#    1. 异步发出10个任务,并发的执行,但是统一的接收所有的任务的返回值.(效率低,不能实时的获取结果)
#    2. 分析结果流程是串行,影响效率.

版本2:(基于版本一的第二个缺点改进而来)

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import requestsdef task(url):content = requests.get(url)return parse(content.text)def parse(obj):return len(obj.result())  # 嵌套函数,并发执行中分析结果,增加了函数的耦合性
# 并发执行任务,每个任务是通过网页获取源码+数据分析,此任务最好是IO阻塞,才能发挥最大的效果
if __name__ == '__main__':pool = ThreadPoolExecutor(4)url_list = ['http://www.JD.com','http://www.JD.com', 'https://home.cnblogs.com/u/lifangzheng/','https://wizardforcel.gitbooks.io/gopl-zh/content/ch0/ch0-01.html', 'https://www.pypypy.cn/#/','https://www.liaoxuefeng.com/', 'https://home.cnblogs.com/u/lifangzheng/','https://home.cnblogs.com/u/lifangzheng/', 'https://gitee.com/clover16', 'https://gitee.com/clover16']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()))

版本3:

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import requestsdef task(url):content = requests.get(url)return content.textdef parse(obj):print(len(obj.result()))if __name__ == '__main__':pool = ThreadPoolExecutor(4)url_list = ['http://www.JD.com','http://www.JD.com', 'https://home.cnblogs.com/u/lifangzheng/','https://wizardforcel.gitbooks.io/gopl-zh/content/ch0/ch0-01.html', 'https://www.pypypy.cn/#/','https://www.liaoxuefeng.com/', 'https://home.cnblogs.com/u/lifangzheng/','https://home.cnblogs.com/u/lifangzheng/', 'https://gitee.com/clover16', 'https://gitee.com/clover16']for url in url_list:obj = pool.submit(task,url)obj.add_done_callback(parse)  # add_done_callback函数无返回值# 线程发布后,由空闲线程执行回调函数

PS:异步处理IO类型,回调处理非IO类型

异步调用和回调函数的关系?

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

线程池+回调函数和进程池+回调函数的小区别:

进程池+回调: 回调函数由主进程去执行,线程池+回调: 回到函数由空闲的线程去执行.

转载于:https://www.cnblogs.com/lifangzheng/p/11415016.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8大策略让你对抗机器学习数据集里的不均衡数据

本文转自&#xff1a;http://www.36dsj.com/archives/35137 http://blog.csdn.net/heyongluoyao8/article/details/49408131 英文版本&#xff1a;http://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/ 你是不是也经历…

线程queue、事件event及协程

线程queue、事件event及协程 线程queue 多线程抢占资源&#xff0c;让其保持串行的两种方式&#xff1a; ​ 1、互斥锁 ​ 2、队列 线程队列分为以下三种&#xff1a; 1、Queue&#xff08;先进先出&#xff09; import queueq queue.Queue(3) q.put(1) q.put(2) q.put(3) # q…

不平衡数据下的机器学习方法简介

本文转自&#xff1a;http://baogege.info/2015/11/16/learning-from-imbalanced-data/ 引言 不管是在学术界还是工业界&#xff0c;不平衡学习已经吸引了越来越多的关注&#xff0c;不平衡数据的场景也出现在互联网应用的方方面面&#xff0c;如搜索引擎的点击预测&#xff08…

CSS预处理——LESS

LESS是什么&#xff1f; less是一门CSS预处理语言。由于CSS本身并不是程序式语言&#xff0c;不方便维护和扩展&#xff0c;没有变量、函数、作用域等概念。而LESS在CSS的基础语法之上&#xff0c;引入了变量、Mixin混入、运算以及函数等功能&#xff0c;大大简化了CSS的编写&a…

不均衡数据的处理方法

关于不均衡数据的处理方法&#xff0c;主要有以下几个方面&#xff1a; 1. 采样的方法 1.1 过采样&#xff0c;采集类标少的样本&#xff0c;达到平衡样本的目的。 方法一&#xff0c;简单的复制类标少的样本 方法二&#xff0c;生成人工样本&#xff08;SMOTE方法&#xff09…

.mat,.txt,.csv 数据转换为weka中的arff格式及matlab和Weka之间相互转换格式

在RUSBoost和SMOTEBoost中提供了csv转换为arff格式的方法&#xff0c;详见CSVtoARFF.m http://www.mathworks.com/matlabcentral/fileexchange/37315-rusboost http://cn.mathworks.com/matlabcentral/fileexchange/37311-smoteboost function r CSVtoARFF (data, relation…

IT人不仅要提升挣钱能力,更要拓展挣钱途径

前几天我上班路上&#xff0c;和小区门口开车的师傅闲聊&#xff0c;发现他们虽然学历不高&#xff0c;但挣钱的途径不少&#xff0c;比如固定接送多位客户&#xff0c;然后能通过朋友圈拓展新客户&#xff0c;而且通过客户口口相传&#xff0c;也能不断拉到生意&#xff0c;算…

Class Imbalance Problem

本文转自&#xff1a;http://www.chioka.in/class-imbalance-problem/#comment-202282 What is the Class Imbalance Problem? It is the problem in machine learning where the total number of a class of data (positive) is far less than the total number of another c…

matlab中的类标转换程序

matlab中的类标转换程序 原始类标为Y&#xff0c;新类标为Y_new %进行排序&#xff0c;针对类标数目orig_labels sort(unique(Y)); Y_new Y;new_labels 1:length(orig_labels);for i1:length(orig_labels)Y_new(find(Yorig_labels(i)))Inf;Y_new(isinf(Y_new))new_labels(…

this关键字+super关键字

一.this关键字1.实例一&#xff1a;&#xff08;1&#xff09;需求&#xff1a;使用Java类描述一个动物&#xff1b;&#xff08;2&#xff09;实例&#xff1a;class Animal{ String name; //成员变量 String color; public Animal(String n,String c){ na…

python中的print

python3 中去除了print语句&#xff0c;加入print()函数实现相同的功能 print() 会在输出窗口中显示一些文本。 >>> print "hello,world!" SyntaxError: Missing parentheses in call to print >>> print("hello,world!") hello,world…

final+static

final final关键字顾名思义代表“最后的”&#xff0c;意味着不能被更改。它的定义&#xff0c;可以概括地分为以下三点&#xff1a; 被final修饰的类不能被继承&#xff1b;被final修饰的方法不能被重写&#xff1b;被final修饰的变量不能被改变。注&#xff1a;引用类型的变量…

程序代码编辑器和浏览器代码编辑器&代码可视化执行过程

tutorialspoint http://www.tutorialspoint.com/codingground.htm 1. Sublime Text &#xff1a;http://blog.l1n3.net/editor/sublime-text-introduce/ 下载 &#xff1a;http://www.sublimetext.com/3 2. Notepad https://notepad-plus-plus.org/zh/ 更多细节请查看 htt…

匿名对象+内部类

匿名对象 普通的类对象在使用时会定义一个类类型的变量&#xff0c;用来保存new出来的类所在的地址。而匿名类取消掉了这个变量&#xff0c;这个地址由编译器来处理&#xff0c;并且在new出来之后&#xff0c;它占用的内存会有JVM自动回收掉。后续无法再使用了。例如 public cl…

听技术播客:一边学Python编程一边学英语

本文转自&#xff1a;http://codingpy.com/article/recommended-python-podcasts/ 学技术的朋友一般都会关注不少技术博客&#xff08;blog&#xff09;&#xff0c;但是关注技术播客&#xff08;podcast&#xff09;的人估计不会太多。这里一方面也是由于相关的播客数量&#…

mysql补充

mysql补充 mysql使用流程 开启服务端&#xff0c;mysqld或者net start mysqlcmd下键入mysql -u root -p&#xff0c;输入设置好的密码&#xff0c;连接mysql客户端show databases&#xff1b;展示所有的mysql仓库创建一个库&#xff1a;create database CRM&#xff1b;然后sho…

编程书单:十本Python编程语言的入门书籍

本文转自&#xff1a;http://codingpy.com/article/10-python-beginner-books/ 本文与大家分享一些Python编程语言的入门书籍&#xff0c;其中不乏经典。我在这里分享的&#xff0c;大部分是这些书的英文版&#xff0c;如果有中文版的我也加上了。有关书籍的介绍&#xff0c;大…

JavaScript异步

JavaScript异步类型 延迟类型&#xff1a;setTimeout、setInterval、setImmediate监听事件&#xff1a;监听new Image加载状态、监听script加载状态、监听iframe加载状态、Message带有异步功能类型&#xff1a; Promise、ajax、Worker、async/awaitJavaScript常用异步编程 Prom…

Sublime配置与各种插件

本文转自&#xff1a;http://www.cnblogs.com/yyhh/p/4232063.html Sublime Text 3 安装Package Control 点击View -> Show Console 在下方命令行内&#xff0c;输入以下命令。 import urllib.request,os;pfPackage Control.sublime-package;ippsublime.installed_packages_…

把Sublime Text 2打造成一个轻量级Python的IDE

本文转自&#xff1a;http://blog.l1n3.net/python/sublime-text-to-python-ide/ 因为这段时间迷上了Python&#xff0c;所以想吧Sublime Text 2弄成一个Python的简易IDE&#xff0c;Python自带的IDLE简直太难用&#xff01;&#xff01;&#xff01;&#xff01; 配置Python环…