zoukankan      html  css  js  c++  java
  • python note 34 并发

    1、socket发送请求

    import socket
    import requests
    
    # 方式一
    ret = requests.get('https://www.baidu.com/s?wd=alex')
    
    # 方式二
    client = socket.socket()
    client.connect(('www.baidu.com',80))
    client.sendall(b'GET /s?wd=alex HTTP/1.0
    host:www.baidu.com
    
    ')
    chunk_list = []
    while True:
        chunk = client.recv(8096)
        if not chunk:
            break
        chunk_list.append(chunk)
    
    body = b''.join(chunk_list)
    print(body.decode('utf-8'))

    2、解决并发

    单线程
    import socket
    import requests
    
    key_list = ['alex','db','sb']
    for item in key_list:
        ret = requests.get('https://www.baidu.com/s?wd=%s' %item)

    3、setblocking(False)将原来阻塞的位置变成非阻塞

    import socket
    
    client = socket.socket()
    client.setblocking(False) # 将原来阻塞的位置变成非阻塞(报错)
    # 百度创建连接: 阻塞
    
    try:
        client.connect(('www.baidu.com',80)) # 执行了但报错了
    except BlockingIOError as e:
        pass
    
    # 检测到已经连接成功
    
    # 问百度我要什么?
    client.sendall(b'GET /s?wd=alex HTTP/1.0
    host:www.baidu.com
    
    ')
    
    # 我等着接收百度给我的回复
    chunk_list = []
    while True:
        chunk = client.recv(8096) # 将原来阻塞的位置变成非阻塞(报错)
        if not chunk:
            break
        chunk_list.append(chunk)
    
    body = b''.join(chunk_list)
    print(body.decode('utf-8'))

    4、协程

    import greenlet
    
    def 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)
    
    gr1.switch()
  • 相关阅读:
    sql 笔记之一
    js的Location
    VS无法使用.XXXX附加到程序
    C#遍历对象的方法
    解决tomcat启动时中文乱码问题。
    动态sql foreach 循环报错问题
    java跳过https证书直接请求工具类
    安装svn报2503错误处理方法
    oracle常用的一些查询命令
    Oracle11g安装过程中忘记进行口令配置
  • 原文地址:https://www.cnblogs.com/P-Z-W/p/11226359.html
Copyright © 2011-2022 走看看