import socket
import gevent
from gevent import monkey
import sys
monkey.patch_all()
# webserver類
class webserver(object):
# 構造方法
def __init__(self, port):
# 初始化伺服器基本配置
# 建立伺服器socket
self.server_socket = socket.socket(socket.af_inet, socket.sock_stream)
# 埠復用
self.server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
# 繫結埠和ip
self.server_socket.bind(("", port))
# 變主動為被動套接字
self.server_socket.listen(128)
# 接收客戶端的請求並處理
def start_up(self):
while true:
# 監聽客戶端的連線
client_socket, ip_port = self.server_socket.accept()
# 開啟協程處理請求
gevent.spawn(self.request_handle, client_socket)
# 處理請求邏輯
def request_handle(self, client_socket):
# 接收客戶端的請求
client_recv = client_socket.recv(4096)
print('client_recv:', client_recv)
# 獲取請求資源路徑
# 拼接響應報文
# 響應報文行
# 響應報文頭
response_headers = 'myserver\r\n'
# 響應體
with open('.' + request_url, 'rb') as file:
response_body = file.read()
# 響應報文
response_data = (response_line + response_headers + '\r\n').encode('utf-8') + response_body
# 傳送響應報文
client_socket.send(response_data)
# 關閉連線
client_socket.close()
# 解析客戶端請求得到請求資源位址
# 獲取請求行
request_line = request_data.split('\r\n')[0]
# 獲取請求url
request_url = request_line.split(' ')[1]
return request_url
def main():
# 命令列輸入
if len(sys.argv) < 2:
print('你需要指定埠')
return
# if not isinstance(sys.argv[1], int):
# print('請輸入整型數字')
# return
# 獲取埠
port = int(sys.argv[1])
# 初始化伺服器
web_server = webserver(port)
# 開啟伺服器
web_server.start_up()
if __name__ == '__main__':
main()
python協程實現
參考 協程,又稱微執行緒,纖程。英文名coroutine。協程是程式級別的,由程式自己決定如何排程。協程的概念 在子程式執行過程中可以中斷去執行別的子程式,而別的子程式也可以中斷回來繼續執行之前的子程式,這個過程就稱為協程。類似與yield操作。協程的優點 無需執行緒切換上下文,避免了無意義的排程。...
python 協程實現與總結
我要把5個任務放到乙個執行緒裡面去 能不能發生併發操作 又乙個程序,切換到另乙個程序,由誰來操作的儲存狀態,由作業系統來 單執行緒可以實現併發,用協程 要找到一種解決方案,讓程式設計師應用程式的角度,找到解決方案,能實現執行乙個任務,切換乙個任務,在切換到另乙個任務,在切換之前把狀態儲存下來 單執行...
Python使用gevent實現協程
coding utf8 import requests import gevent from gevent import monkey monkey.patch all 用於將標準庫中大部分阻塞式呼叫修改為協作式執行 def fetch url print get format url respon...