11、协程和io教程02 -- IO多路复中select+回调+事件循环获取

01、非阻塞IO完成http请求

--通过设置:
    client.setblocking(False)  # 设置不阻塞连接过程,直接设置会报错 -- BlockingIOError: [WinError 10035] 无法立即完成一个非阻止性套接字操作。

--在send recv函数上做错误处理OSError  BlockingIOError,并不停循环。示例代码如下:
    --这种方式属于IO非阻塞实现http请求
# 非阻塞IO带给我们的好处:通过非阻塞IO实现
import time
import socket
from urllib.parse import urlparse

def get_url(url):
    # 解析出url
    url = urlparse(url)
    host = url.netloc
    path = url.path
    if path == "":
        path = "/"

    # 建立socket连接
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.setblocking(False)  # 设置不阻塞连接过程,直接设置会报错 -- BlockingIOError: [WinError 10035] 无法立即完成一个非阻止性套接字操作。

    try:  # 为了处理报错需要,try处理。但是仅仅try还是不行,需要查询是否连接完毕
        client.connect((host, 80))
    except BlockingIOError as e:  # OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
        pass

    # 不停轮询发送请求直至确认连接,这里send会抛OSError,recv会抛BlockingIOError
    while True:
        try:
            client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf8"))
            print("send")
            break
        except OSError as e:
            pass

    # 接受请求
    data = b""
    while True:
        try:
            d = client.recv(1024)
            print(d)
        except BlockingIOError as e:
            continue
        if d:
            data += d
        else:
            break

    # 打印数据
    data = data.decode("utf8")
    html_data = data.split("\r\n\r\n")[1]
    print(html_data)
    client.close()


if __name__ == "__main__":
    start_time = time.time()
    url = "https://www.baidu.com/"
    print(url)
    get_url(url)
    print(time.time() - start_time)

02、IO多路复用 -- select方式完成http请求

--select重新温习:
    --import select包,系统自带。这个包不常用
    --from selectors import DefaultSelector 使用这个包无需关心平台,且功能更加高级
        --DefaultSelector 除了提供和IO复用的方法,还提供了注册的机制
--示例代码如下:

03、

04、回调的缺点

--回调将函数逻辑割裂

--回调的异常处理非常困难

--回调的多层嵌套:
    --多层嵌套中有一层出现问题都会导致问题
    --如果数据在多个嵌套中都需要被使用怎么办
    --如何使用当前函数中的局部变量

05、什么是协程

高并发的实现原始方式有哪些痛点:
    --回调模式代码编写复杂度高
    --同步编程的并发性不高
    --多线程的线程间同步使用lock机制,导致并发性能下降

--解决方案:
    --采用同步的方式编写异步的代码
    --是用单线程来切换任务
        --线程是由操作系统切换的,单线程切换意味着需要程序员自己去调度任务
        --不再需要锁,并发性高

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是SWFUpload?   SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 [编辑本段]SWFUpload的主要特点   * 可以同时上传多个文件;   * 类似AJAX的无刷新上传;   * 可以显示上传进度;   * 良好的浏览器兼容性;   * 兼容其他JavaScript库 (例如:jQuery, Prototype等);   * 支持Flash 8和Flash 9;   SWFUpload不同于其他基于Flash构建的上传工具,它有着优雅的代码设计,开发者可以利用XHTML、CSS和JavaScript来随心所欲的定制它在浏览器下的外观;它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的在文件上传过程中更新页面内容来营造各种动态效果。   在使用SWFUpload之前,请确认你具备一定的JavaScript和DOM知识。在实际开发中,大部分的错误都是由于错误的设置和低劣的Event Handlers处理程序所造成的。 [编辑本段]文档中文翻译   http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html [编辑本段]效果演示   * Classic Form Demo http://demo.swfupload.org/formsdemo ;   * Features Demo http://demo.swfupload.org/featuresdemo ;   * Application Demo http://demo.swfupload.org/applicationdemo ;   * v1.0.2 Plugin Demo http://demo.swfupload.org/v102demo ; [编辑本段]选择合适的Flash控件   在发行包(SWFUpload v2)中含有2个版本的Flash控件(swfupload_f8.swf 与wfupload_f9.swf),其中第一个版本拥有最佳的兼容性,但是为此损失了部分功能;而第二个版本提供了一些附加的功能但是损失了兼容性。 [编辑本段]SWFUpload的初始化与配置   首先,在页面中引用SWFUpload.js ,如      然后,初始化SWFUpload ,如   var swfu;   window.onload = function () {   swfu = new SWFUpload({   upload_url : "http://www.swfupload.org/upload.php",   flash_url : "http://www.swfupload.org/swfupload_f9.swf", file_size_limit : "20480"   });   };   以下是一个标准的SWFUpload初始化设置所需的参数,你可以根据需要自己进行删减:   {   upload_url : "http://www.swfupload.org/upload.php", 处理上传请求的服务器端脚本URL   file_post_name : "Filedata", 是POST过去的$_FILES的数组名   post_params : {   "post_param_name_1" : "post_param_value_1",   "post_param_name_2" : "post_param_value_2",   "post_param_name_n" : "post_param_value_n"   },   file_types : "*.jpg;*.gif", 允许上传的文件类型   file_types_description: "Web Image Files", 文件类型描述   file_size_limit : "1024", 上传文件体积上限,单位MB   file_upload_limit : 10, 限定用户一次性最多上传多少个文件,在上传过程中,该数字会累加,如果设置为“0”,则表示没有限制   file_queue_limit : 2, 上传队列数量限制,该项通常不需设置,会根据file_upload_limit自动赋值   fl

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值