当前位置: 首页 > news >正文

南京做网站找哪家深圳投资公司实力排行榜

南京做网站找哪家,深圳投资公司实力排行榜,wechat登录入口,枫叶建站最近在学python的网络编程#xff0c;学了socket通信#xff0c;并利用socket实现了一个具有用户验证功能#xff0c;可以上传下载文件、可以实现命令行功能#xff0c;创建和删除文件夹#xff0c;可以实现的断点续传等功能的FTP服务器。但在这当中#xff0c;发现一些概…最近在学python的网络编程学了socket通信并利用socket实现了一个具有用户验证功能可以上传下载文件、可以实现命令行功能创建和删除文件夹可以实现的断点续传等功能的FTP服务器。但在这当中发现一些概念区分起来很难比如并发和并行同步和异步阻塞和非阻塞但是这些概念却很重要。因此在此把它总结下来。 1. 并发 并行 并发在操作系统中是指一个时间段中有几个程序都处于已启动运行到运行完毕之间且这几个程序都是在同一个处理机上运行但任一个时刻点上只有一个程序在处理机上运行。简言之是指系统具有处理多个任务的能力。 并行当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时另一个CPU可以执行另一个线程两个线程互不抢占CPU资源可以同时进行这种方式我们称之为并行(Parallel)。简言之是指系统具有同时处理多个任务的能力。 下面我们来两个例子 import threading #线程 import timedef music():print(begin to listen music {}.format(time.ctime()))time.sleep(3)print(stop to listen music {}.format(time.ctime()))def game():print(begin to play game {}.format(time.ctime()))time.sleep(5)print(stop to play game {}.format(time.ctime()))if __name__ __main__:music()game()print(ending.....) music的时间为3秒game的时间为5秒如果按照我们正常的执行直接执行函数那么将按顺序顺序执行整个过程8秒。 import threading #线程 import timedef music():print(begin to listen music {}.format(time.ctime()))time.sleep(3)print(stop to listen music {}.format(time.ctime()))def game():print(begin to play game {}.format(time.ctime()))time.sleep(5)print(stop to play game {}.format(time.ctime()))if __name__ __main__:t1 threading.Thread(targetmusic) #创建一个线程对象t1 子线程t2 threading.Thread(targetgame) #创建一个线程对象t2 子线程t1.start()t2.start()# t1.join() #等待子线程执行完 t1不执行完谁也不准往下走t2.join()print(ending.......) #主线程print(time.ctime()) 在这个例子中我们开了两个线程将music和game两个函数分别通过线程执行运行结果显示两个线程同时开始由于听音乐时间3秒玩游戏时间5秒所以整个过程完成时间为5秒。我们发现通过开启多个线程原本8秒的时间缩短为5秒原本顺序执行现在是不是看起来好像是并行执行的看起来好像是这样听音乐的同时在玩游戏整个过程的时间随最长的任务时间变化。但真的是这样吗那么下面我来提出一个GIL锁的概念。 GIL(全局解释器锁无论你启多少个线程你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行。 import time from threading import Threaddef add():sum 0i 1while i1000000:sum ii 1print(sum:,sum)def mul():sum2 1i 1while i100000:sum2 sum2 * ii 1print(sum2:,sum2)start time.time()add() mul() #串行比多线程还快print(cost time %s%(time.time()-start)) import time from threading import Threaddef add():sum 0i 1while i1000000:sum ii 1print(sum:,sum)def mul():sum2 1i 1while i100000:sum2 sum2 * ii 1print(sum2:,sum2)start time.time() t1 Thread(targetadd) t2 Thread(targetmul)l [] l.append(t1) l.append(t2)for t in l:t.start()for t in l:t.join()print(cost time %s%(time.time()-start)) 哎吆这是怎么回事串行执行比多线程还快不符合常理呀。是不是颠覆了你的人生观这个就和GIL锁有关同一时刻系统只允许一个线程执行那么就是说本质上我们之前理解的多线程的并行是不存在的那么之前的例子为什么时间确实缩短了呢这里有涉及到一个任务的类型。 --任务 1.IO密集型会有cpu空闲的时间 注sleep等同于IO操作 socket通信也是IO 2.计算密集型而之前那个例子恰好是IO密集型的例子后面这个由于涉及到了加法和乘法属于计算密集型操作那么就产生了一个结论多线程对于IO密集型任务有作用 而计算密集型任务不推荐使用多线程。而其中我们还可以得到一个结论由于GIL锁多线程不可能真正实现并行所谓的并行也只是宏观上并行微观上并发本质上是由于遇到io操作不断的cpu切换 所造成并行的现象。由于cpu切换速度极快所以看起来就像是在同时执行。--问题没有利用多核的优势 --这就造成了多线程不能同时执行并且增加了切换的开销串行的效率可能更高。 2. 同步 异步 对于一次IO访问以read举例数据会先被拷贝到操作系统内核的缓冲区中然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说当一个read操作发生时它会经历两个阶段 1. 等待数据准备 (Waiting for the data to be ready)2. 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)同步当进程执行IO(等待外部数据的时候-----等。同步例如打电话的时候必须等 异步当进程执行IO(等待外部数据的时候-----不等去执行其他任务一直等到数据接收成功再回来处理。异步例如发短信 当我们去爬取一个网页的时候要爬取多个网站有些人可能会发起多个请求然后通过函数顺序调用。执行顺序也是先调用先执行。效率非常低。 下面我们看一下异步的一个例子 import socket import select ########http请求本质IO阻塞######## sk socket.socket() #1.连接 sk.connect((www.baidu.com,80,)) #阻塞 print(连接成功了) #2.连接成功后发送消息 sk.send(bGET / HTTP/1.0\r\nHost: baidu.com\r\n\r\n)#3.等待服务端响应 data sk.recv(8096)#阻塞 print(data) #\r\n\r\n区分响应头和影响体#关闭连接 sk.close()########http请求本质IO非阻塞######## sk socket.socket() sk.setblocking(False) #1.连接 try:sk.connect((www.baidu.com,80,)) #非阻塞但会报错print(连接成功了) except BlockingIOError as e:print(e)#2.连接成功后发送消息 sk.send(bGET / HTTP/1.0\r\nHost: baidu.com\r\n\r\n)#3.等待服务端响应 data sk.recv(8096)#阻塞 print(data) #\r\n\r\n区分响应头和影响体#关闭连接 sk.close() class HttpRequest:def __init__(self,sk,host,callback):self.socket skself.host hostself.callback callbackdef fileno(self):return self.socket.fileno()class HttpResponse:def __init__(self,recv_data):self.recv_data recv_dataself.header_dict {}self.body Noneself.initialize()def initialize(self):headers, body self.recv_data.split(b\r\n\r\n, 1)self.body bodyheader_list headers.split(b\r\n)for h in header_list:h_str str(h,encodingutf-8)v h_str.split(:,1)if len(v) 2:self.header_dict[v[0]] v[1]class AsyncRequest:def __init__(self):self.conn []self.connection [] # 用于检测是否已经连接成功def add_request(self,host,callback):try:sk socket.socket()sk.setblocking(0)sk.connect((host,80))except BlockingIOError as e:passrequest HttpRequest(sk,host,callback)self.conn.append(request)self.connection.append(request)def run(self):while True:rlist,wlist,elist select.select(self.conn,self.connection,self.conn,0.05)for w in wlist:print(w.host,连接成功...)# 只要能循环到表示socket和服务器端已经连接成功tpl GET / HTTP/1.0\r\nHost:%s\r\n\r\n %(w.host,)w.socket.send(bytes(tpl,encodingutf-8))self.connection.remove(w)for r in rlist:# r,是HttpRequestrecv_data bytes()while True:try:chunck r.socket.recv(8096)recv_data chunckexcept Exception as e:breakresponse HttpResponse(recv_data)r.callback(response)r.socket.close()self.conn.remove(r)if len(self.conn) 0:breakdef f1(response):print(保存到文件,response.header_dict)def f2(response):print(保存到数据库, response.header_dict)url_list [{host:www.youku.com,callback: f1},{host:v.qq.com,callback: f2},{host:www.cnblogs.com,callback: f2}, ]req AsyncRequest() for item in url_list:req.add_request(item[host],item[callback])req.run() 我们可以看到三个请求发送顺序与返回顺序并不一样这样就体现了异步请求。即我同时将请求发送出去哪个先回来我先处理哪个。 即我们可以理解为我打电话的时候只允许和一个人通信和这个人通信结束之后才允许和另一个人开始。这就是同步。 我们发短信的时候发完可以不去等待去处理其他事情当他回复之后我们再去处理这样就大大解放了我们的时间。这就是异步。 体现在网页请求上面就是我请求一个网页时候等待他回复否则不接收其它请求这就是同步。另一种就是我发送请求之后不去等待他是否回复而去处理其它请求当处理完其他请求之后某个请求说我的回复了然后程序转而去处理他的回复数据。这就是异步请求。所以异步可以充分cpu的效率。 3. 阻塞 非阻塞 调用blocking IO会一直block住对应的进程直到操作完成而non-blocking IO在kernel还准备数据的情况下会立刻返回。 下面我们通过socket实现一个命令行功能来感受一下。 #服务端 from socket import * import subprocess import structip_port (127.0.0.1, 8000) buffer_size 1024 backlog 5tcp_server socket(AF_INET, SOCK_STREAM) tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它在bind前加 tcp_server.bind(ip_port) tcp_server.listen(backlog)while True:conn, addr tcp_server.accept()print(新的客户端链接, addr)while True:try:cmd conn.recv(buffer_size)print(收到客户端命令:, cmd.decode(utf-8))#执行命令cmd得到命令的结果cmd_resres subprocess.Popen(cmd.decode(utf-8),shellTrue,stderrsubprocess.PIPE,stdoutsubprocess.PIPE,stdinsubprocess.PIPE,)err res.stderr.read()if err:cmd_res errelse:cmd_res res.stdout.read()if not cmd_res:cmd_res 执行成功.encode(gbk)#解决粘包length len(cmd_res)data_length struct.pack(i,length)conn.send(data_length)conn.send(cmd_res)except Exception as e:print(e)breakconn.close()#客户端 from socket import *ip_port (127.0.0.1,8000) buffer_size 1024 backlog 5tcp_client socket(AF_INET,SOCK_STREAM) tcp_client.connect(ip_port)while True:cmd input(:).strip()if not cmd:continueif cmd quit:breaktcp_client.send(cmd.encode(utf-8))#解决粘包length tcp_client.recv(4)length struct.unpack(i,length)[0]recv_size 0recv_msg bwhile recv_size length:recv_msg tcp_client.recv(buffer_size)recv_size len(recv_msg)print(recv_msg.decode(gbk)) 开启了服务器和一个客户端之后我们在客户端输入一些命令然后正确显示功能实现。这是在我再打开一个客户端输入命令发现服务器迟迟没有响应。 这个就是当一个客户端在请求的时候当这个客户端没有结束的时候服务器不会去处理其他客户端的请求。这时候就阻塞了。 如何让服务器同时处理多个客户端请求呢 View Code 这段代码通过socketserver模块实现了socket的并发。这个过程中当一个客户端在向服务器请求的时候另一个客户端也可以正常请求。服务器在处理一个客户端请求的时候另一个请求没有被阻塞。 总结只要有一丁点阻塞就是阻塞IO。 异步IO的特点就是全程无阻塞。 有些人常把同步阻塞和异步非阻塞联系起来但实际上经过分析阻塞与同步非阻塞和异步的定义是不一样的。同步和异步的区别是遇到IO请求是否等待。阻塞和非阻塞的区别是数据没准备好的情况下是否立即返回。关于这两点的区别看了很多博客最后总结如下。 阻塞和非阻塞指的是执行一个操作是等操作结束再返回还是马上返回。 比如餐馆的服务员为用户点菜当有用户点完菜后服务员将菜单给后台厨师此时有两种方式 第一种就在出菜窗口等待直到厨师炒完菜后将菜送到窗口然后服务员再将菜送到用户手中第二种等一会再到窗口来问厨师某个菜好了没如果没有先处理其他事情等会再去问一次 第一种就是阻塞方式第二种则是非阻塞的。 同步和异步又是另外一个概念它是事件本身的一个属性。还拿前面点菜为例服务员直接跟厨师打交道菜出来没出来服务员直接知道但只有当厨师将菜送到服务员手上这个过程才算正常完成这就是同步的事件。同样是点菜有些餐馆有专门的传菜人员当厨师炒好菜后传菜员将菜送到传菜窗口并通知服务员这就变成异步的了。其实异步还可以分为两种带通知的和不带通知的。前面说的那种属于带通知的。有些传菜员干活可能主动性不是很够不会主动通知你你就需要时不时的去关注一下状态。这种就是不带通知的异步。 对于同步和异步的事件阻塞和非阻塞都是可以的。非阻塞又有两种方式主动查询和被动接收消息。被动不意味着一定不好在这里它恰恰是效率更高的因为在主动查询里绝大部分的查询是在做无用功。对于带通知的异步事件两者皆可。而对于不带通知的则只能用主动查询。 但是对于非阻塞和异步的概念有点混淆非阻塞只是意味着方法调用不阻塞就是说作为服务员的你不用一直在窗口等非阻塞的逻辑是等可以读写了告诉你但是完成读写工作的还是调用者线程服务员的你等菜到窗口了还是要你亲自去拿。而异步意味这你可以不用亲自去做读写这件事你的工作让别人别的线程来做你只需要发起调用别人把工作做完以后或许再通知你它的逻辑是“我做完了 告诉/不告诉 你”他和非阻塞的区别在于一个是已经做完另一个是可以去做。 这也是同步和异步最大的区别就是同步在有通知时可以进行相关操作而异步有通知时则代表操作已经完成 再举一个例子 去书店借一本书同步就是我要亲自到书店问老板有没有这本书阻塞就是老板查询的时候读写我只能在那等着老板找到书后把书交给我这就是同步阻塞。 我亲自到书店借书老板在找这本书的时候我可以去干别的然后每隔一段时间去问老板书找到了没有也可以等老板找到书以后通知我这就是同步非阻塞。 我想借本书找个人帮我去借借到书以后再通知我这就是异步我只发起调用但是本身并不参与这个事件而是让别的线程去做这个事。 同步与异步是对应的它们是线程之间的关系两个线程之间要么是同步的要么是异步的。 阻塞与非阻塞是对同一个线程来说的在某个时刻线程要么处于阻塞要么处于非阻塞。 帮我借书的那个人有没有借到书我可以打电话问他轮询也可以等他通知我,这是异步的通知在借书的过程中借书的那个人可以轮询的方式查看书是否已经找到缓冲区有没有数据找到了你可以把它拿走也可以等老板找到书后通知我这是非阻塞的通知与轮询。 这里面其实涉及到的知识点还很多这里只是凭我的记忆简单总结了一下以后会补充更多。
http://www.w-s-a.com/news/329553/

相关文章:

  • 公司开发的网站健身网站开发项目总结
  • 怎样做游戏网站网站建设万首先金手指14
  • 英德建设局网站龙岩网上房地产网
  • wordpress vr网站电影网页设计尺寸
  • 做淘宝客新增网站推广怎样开一家公司
  • 企业网站有必要做吗?网站平均停留时间
  • 蘑菇街的网站建设凡科网站建设网页怎么建
  • 中国光大国际建设工程公司网站论坛是做网站还是app好
  • 地产集团网站建设高德是外国公司吗?
  • 天津市网站建站制作网站建设新报价图片欣赏
  • 怎么样在百度搜到自己的网站高端房产网站建设
  • 邯郸做移动网站多少钱ui设计好就业吗
  • 共享虚拟主机普惠版做网站产品推广包括哪些内容
  • 广州市网站建站免费咨询医生有问必答
  • app网站建设制作哪个网站可以做魔方图片
  • 教育培训网站建设方案模板下载网站文风
  • 电龙网站建设wordpress文章两端对齐
  • 做外单网站亚马逊免费的网站加速器
  • 英文网站推广工作一个虚拟主机可以做几个网站吗
  • 微网站 合同重庆电力建设设计公司网站
  • 网站怎么设置支付网站源码下载后怎么布置
  • 广州市公需课在哪个网站可以做手机商城软件下载
  • app网站建设需要什么长治网站建设公司
  • 网站模板平台广告宣传网站
  • cc域名的网站做网站放太多视频
  • 让公司做网站要注意什么建设工程公司企业文化
  • 佛山搭建建网站哪家好微信如何建立自己的公众号
  • 联想公司网站建设现状广州建网站兴田德润团队
  • 网站开发的技术有网页设计实训报告工作内容和步骤
  • 视频做网站长沙网站制作平台