首页 > 编程语言 > 详细

python note 34 并发

时间:2019-07-22 16:45:05      阅读:74      评论:0      收藏:0      [点我收藏+]

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(bGET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n)
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(bGET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n)

# 我等着接收百度给我的回复
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()

 

python note 34 并发

原文:https://www.cnblogs.com/P-Z-W/p/11226359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!