单线程的并发,协程

IO多路复用

作用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)

setblocking(Flase)

让原本阻塞的变成非阻塞(不等待)状态

import socket
import selectsk = socket.socket()
sk.setblocking(False)
try:sk.connect(("www.baidu.com",80))
except BlockingIOError as e:passsk1 = socket.socket()
sk1.setblocking(False)
try:sk1.connect(("www.douban.com",80))
except BlockingIOError as e:passsk2 = socket.socket()
sk2.setblocking(False)
try:sk2.connect(("www.zhihu.com",80))
except BlockingIOError as e:pass

基于IO多路复用+socket实现并发请求

单线程的并发

import socket
import selectclient1 = socket.socket()
client1.setblocking(False) # 百度创建连接: 非阻塞try:client1.connect(('www.baidu.com',80))
except BlockingIOError as e:passclient2 = socket.socket()
client2.setblocking(False) # 百度创建连接: 非阻塞
try:client2.connect(('www.sogou.com',80))
except BlockingIOError as e:passclient3 = socket.socket()
client3.setblocking(False) # 百度创建连接: 非阻塞
try:client3.connect(('www.oldboyedu.com',80))
except BlockingIOError as e:passsocket_list = [client1,client2,client3]
conn_list = [client1,client2,client3]while True:rlist,wlist,elist = select.select(socket_list,conn_list,[],0.005)# wlist中表示已经连接成功的socket对象for sk in wlist:if sk == client1:sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n')elif sk==client2:sk.sendall(b'GET /web?query=fdf HTTP/1.0\r\nhost:www.sogou.com\r\n\r\n')else:sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.oldboyedu.com\r\n\r\n')conn_list.remove(sk)for sk in rlist:chunk_list = []while True:try:chunk = sk.recv(8096)if not chunk:breakchunk_list.append(chunk)except BlockingIOError as e:breakbody = b''.join(chunk_list)# print(body.decode('utf-8'))print('------------>',body)sk.close()socket_list.remove(sk)if not socket_list:break

单线程的并发高级

基于事件循环实现的异步非阻塞框架:lzl

Python中有开源 基于事件循环实现的异步非阻塞框架 Twisted 

非阻塞:让过程不再等待,但是会报BLockIOError的错误,只要捕获就可以

异步:执行完某个任务后自动调用我给他的函数,也就是回调函数

import socket
import selectclass Req(object):def __init__(self,sk,func):self.sock = skself.func = funcdef fileno(self):return self.sock.fileno()class Nb(object):def __init__(self):self.conn_list = []self.socket_list = []def add(self,url,func):client = socket.socket()client.setblocking(False)  # 非阻塞try:client.connect((url, 80))except BlockingIOError as e:passobj = Req(client,func)self.conn_list.append(obj)self.socket_list.append(obj)def run(self):while True:rlist,wlist,elist = select.select(self.socket_list,self.conn_list,[],0.005)# wlist中表示已经连接成功的req对象for sk in wlist:# 发生变换的req对象sk.sock.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n')self.conn_list.remove(sk)for sk in rlist:chunk_list = []while True:try:chunk = sk.sock.recv(8096)if not chunk:breakchunk_list.append(chunk)except BlockingIOError as e:breakbody = b''.join(chunk_list)# print(body.decode('utf-8'))sk.func(body)sk.sock.close()self.socket_list.remove(sk)if not self.socket_list:breakdef baidu_repsonse(body):print('百度下载结果:',body)def sogou_repsonse(body):print('搜狗下载结果:', body)def oldboyedu_repsonse(body):print('老男孩下载结果:', body)t1 = Nb()
t1.add('www.baidu.com',baidu_repsonse)
t1.add('www.sogou.com',sogou_repsonse)
t1.add('www.oldboyedu.com',oldboyedu_repsonse)
t1.run()

具体使用方法

from lzl import Nbdef baidu_repsonse(body):print('百度下载结果:',body)def sogou_repsonse(body):print('搜狗下载结果:', body)def oldboyedu_repsonse(body):print('老男孩下载结果:', body)t1 = Nb()
t1.add('www.baidu.com',baidu_repsonse)
t1.add('www.sogou.com',sogou_repsonse)
t1.add('www.oldboyedu.com',oldboyedu_repsonse)
t1.run() 

协程

本身是不存在的,是由开发人员创造出来的一个不是真实存在的东西

微线程,对一个线程/进程进行分片,使得线程在代码块之间进行来回切换执行,而不是原来那样逐行执行

单纯的协程是没有什么实际用处的

import  greenletdef f1():print(11)gr2.switch()print(22)gr2.switch()def f2():print(33)gr1.switch()print(44)# 协程 gr1
gr1 = greenlet.greenlet(f1)
# 协程 gr2
gr2 = greenlet.greenlet(f2)# 输出结果:
11
33
22
44# 单纯的协程编写起来还不如我直接写函数调用来的方便呢,所以单纯的协程是无用的def f1():print(11)print(33)def f2():print(22)print(44)f1()
f2()# 输出结果是一样的:
11
33
22
44  

协程 + IO切换,那它才真正的厉害起来

from gevent import monkey
monkey.patch_all()import requests
import geventdef get_path(url):ret = requests.get(url)print(url, ret.content)def get_path2(url):ret2 = requests.get(url)print("-----------",url,ret2.content)def get_path3(url):ret3 = requests.get(url)print(url,ret3.content)ret = gevent.joinall([gevent.spawn(get_path,'https://www.zhihu.com'),gevent.spawn(get_path2,"https://www.douban.com"),gevent.spawn(get_path3,"https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=zkx"),
])

  

转载于:https://www.cnblogs.com/--kai/p/9643122.html

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

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

相关文章

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等…

android.mk 模块编译,通过Android.mk添加一个编译模块到系统中的顺序如下

①LOCAL_PATH②CLEAR_VARS③LOCAL_SRC_FILES④LOCAL_CFLAGS(可选)⑤LOCAL_MODULE⑥LOCAL_STATIC_LIBRARIES(可选)⑦BUILD_XXX(12)Android.mk常用的变量变量名 说明LOCAL_PATH 用于确定源码所在的目录,最好把它放在CLEAR_VARS变量引用的前面,因为它不会被…

使用Spring Reactor Core进行分散收集

我在使用Netflix Rx-Java库方面有良好的工作经验,并且以前曾写过关于使用Rx-Java和Java 8 CompletableFuture解决分散式问题的博客。 在这里,我想探索使用Spring Reactor Core库应用相同的模式。 tldr –如果您熟悉Netflix Rx-Java,您已经很…

添加操作审计记录

1.所有操作审计记录 在环境变量/etc/profile中加入如下字段,可记录所有用户登录系统的操作 #history bash USERwhoami USER_IPwho -u am i 2>/dev/null| awk {print $NF}|sed -e s/[()]//g if [ "$USER_IP" "" ]; then USER_IPhostname fi …

android sharesdk分享功能,Android ShareSDK快速实现分享功能

第一步 :获取ShareSDK为了集成ShareSDK,您首先需要到ShareSDK官方网站注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包,解压以后可以得到如下图的目录结构:ShareSDK在“ShareSD…

shell编程-分支语句

目标:完成这一章,你将能够作以下事情:描述条件分支语句中返回值的作用。 使用test命令来分析一个命令的返回值。 在shell程序中使用if和case结构。 1.返回值shell变量“?”中保存上一个被执行命令的返回值:0&#xff1…

android自定义表盘部件,Android自定义view仿支付宝芝麻信用表盘

演示效果实现步骤:1.画不同宽度和半径的内外圆弧2.通过循环旋转canvas,在固定位置绘制短线刻度,长线刻度,刻度文字3.绘制view中心几个文本,并调整位置4.实时更新当前旋转角度刷新小圆点位置;5.判断分数应该…

记录的详细操作

拷贝表拷贝结构 与数据create table copy_table select *from customer ;仅拷贝结构create table copy_table select *from customer where 0 > 1;共同点: 索引 描述(自增) 不能以下语法中记录的详细操作[] 表示可选的{}表示必选的增ins…

linux查看文件有多少行

使用wc命令 具体通过wc --help 可以查看。 如:wc -l filename 就是查看文件里有多少行 wc -w filename 看文件里有多少个word。 wc -L filename 文件里最长的那一行是多少个字。 wc命令 wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。 …

java 消息通知_用Java弹出创建新的消息通知

java 消息通知首先创建JFrame作为弹出窗口。 在其中添加一些JLabel以包含信息,并在适当的位置分配它们,使其看起来像一条通知消息。 下面给出了示例代码: String message You got a new notification message. Isnt it awesome to have suc…

vs android 压缩,Android Studio是否压缩classes.dex文件?

看起来输出文件夹中apk文件的classes.dex与已安装的应用程序不同.我正在使用classes.dex文件来解决一些安全问题,所以通常我解压缩最终的apk文件并从classes.dex文件中获取信息.但是当我在运行时读取classes.dex文件时文件大小是如此不同. (8MB vs 46KB)应用程序本身工作得很好…

自己写的py文件中调用django models

import os os.environ[DJANGO_SETTINGS_MODULE] 项目名.settingsimport djangodjango.setup()from blog import modelsentry models.Entry.objects.get(pk1)tech_blog models.Blog.objects.get(name科技)print(entry, tech_blog) 转载于:https://www.cnblogs.com/dangrui072…

shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有! -e这又是什么意思呢?

shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有"! -e"这又是什么意思呢? -e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规…

将Java应用程序作为Windows服务安装

这听起来像是您不需要的东西,但是有时候,当您分发最终用户软件时,可能需要将Java程序安装为Windows服务。 我之所以必须这样做,是因为我开发了一种用于公务员的工具 ,可以自动将其Excel文件转换并将其推入我国的openda…

怎样实现banner自动播放html,纯CSS3实现banner图片自动轮播效果方式总结

自动轮播:实现切换图片,图片循环播放;鼠标悬停某张图片, 则暂停切换。css方法一、opacity控制透明度实现轮播效果依照需求咱们选择用CSS3的animation动画进行实现;transition动画须要触发才能启动,html因此…

你好a+b(非入门)

题目传送门&#xff1a;https://www.nowcoder.com/acm/contest/165/A来源&#xff1a;牛客网 牛牛刚学习了输入输出&#xff0c;他遇到了一道这样的题目。 输入2个整数a和b保证输入的a和b在long long范围之内&#xff0c;即满足-9223372036854775808 < a, b < 9223372036…

/etc/sysconfig/i18n文件详解

编辑/etc/sysconfig/i18n这个文件&#xff0c; 不管你装的是中文版,还是英文版.删掉原来的设置,把下面的拷贝过去 LANG"zh_CN.GB18030" SUPPORTED"zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT"latarcyrheb-sun16" 保存,重起.OK了 这时…

201771010112罗松《面向对象程序设计(java)》第三周学习总结

实验三 Java基本程序设计 201771010112 罗松 1、实验目的与要求 &#xff08;1&#xff09;进一步掌握Eclipse集成开发环境下java程序开发基本步骤&#xff1b; &#xff08;2&#xff09;熟悉PTA平台线上测试环境&#xff1b; &#xff08;3&#xff09;掌握Java语言构造基本…

构建openjdk镜像_在Windows上构建OpenJDK

构建openjdk镜像通过做一些实验&#xff0c;我发现手头提供JDK源代码来进行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我决定下载并编译该野兽。 显然&#xff0c;这花了我一些时间&#xff0c;尽管我最初的想法是&#xff0c;它应该和运行make命令一样简单:…

html图像特征提取,图像识别之图像特征提取

图像识别之图像特征提取HOG特征&#xff1a;方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处置中用来停止物体检测的特征描绘子。它经过计算和统计图像部分区域的梯度方向直方图来构成特征。Hog特征分离SVM分类器曾经被普遍应用于图像辨认…