python note 34 併發

一、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\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'))

二、解決併發app

單線程
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)

三、setblocking(False)將原來阻塞的位置變成非阻塞socket

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\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'))

四、協程spa

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()
相關文章
相關標籤/搜索