一、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()