22,python實現 協程實現

2021-08-20 13:38:04 字數 2113 閱讀 2723

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...