單程序單執行緒非堵塞方式實現http伺服器
#!/usr/bin/python3.5 # -*- coding: utf-8 -*- # @Time : 18-7-2 下午6:53 # @Author : "Fengwr" # @email : [email protected] # @File : http_單程序_單執行緒_非堵塞.py # @Software: PyCharm import socket import re def http_sever(new_socket, recv_data): recv_data_list = recv_data.splitlines() ret = re.match(r"[^/]+(/[^ ]*)",recv_data_list[0]) file_name = "" if ret: file_name = ret.group(1) if file_name == "/": file_name = "/index.html" http_header = "" http_body = "" try: f = open("./html" + file_name, "rb") except: http_body = "<h1>Sorry not found</h1>".encode("utf-8") http_header = "HTTP/1.1 404 NOT FOUND\r\n" http_header += "Content-Length:%d\r\n\r\n" % len(http_body) else: http_body = f.read() f.close() http_header = "HTTP/1.1 200 OK\r\n" http_header += "Content-Length:%d\r\n\r\n" % len(http_body) new_socket.send(http_header.encode("utf-8")) new_socket.send(http_body) def main(): tcp_sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_sever_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcp_sever_socket.bind(("",7890)) tcp_sever_socket.listen(128) # 設定非堵塞 tcp_sever_socket.setblocking(False) client_lists = list() while True: try: new_socket, new_add = tcp_sever_socket.accept() except Exception as ret: pass else: # 設定非堵塞 new_socket.setblocking(False) client_lists.append(new_socket) for client_socket in client_lists: try: # 嘗試接收資料 recv_data = client_socket.recv(1024).decode("utf-8") except Exception as f: # 如果沒有資料 pass else: # 如果有資料有兩種情況,1,客戶端發來了資料,2客服端下線 if recv_data: http_sever(client_socket, recv_data) else: client_socket.close() client_lists.remove(client_socket) tcp_sever_socket.close() if __name__ == '__main__': main()
新知識點:socket.setbloking(False) # 將套接字設定為非堵塞的方式。 Content-Length:%d % len(http_body) # 告訴客戶端要傳送的body內容的長度,實現長連結傳送。
相關推薦
單程序單執行緒非堵塞方式實現http伺服器
#!/usr/bin/python3.5 # -*- coding: utf-8 -*- # @Time : 18-7-2 下午6:53 # @Author : "Fengwr" # @email : [email protected] # @File
互斥量在多程序,單程序不同執行緒間使用
直接上程式碼了: #include <stdio.h> #include <stdlib.h> #include <Windows.h> int main() { /* 第二個引數:TRUE在建立互斥量之後立馬擁有該互斥量,
多程序單執行緒模型與單程序多執行緒模型之爭
伺服器,事件 多程序單執行緒模型典型代表:nginx 單程序多執行緒模型典型代表:memcached 另外redis, mongodb也可以說是走的“多程序單執行緒模”模型(叢集),只不過作為資料庫伺服器,需要進行防寫,只提供了讀同步。 原因很簡單,因為伺服器的發展大部分都
程序與執行緒的區別與聯絡、程序與執行緒的通訊方式.md
一、為什麼引入程序? 程序是為了提高CPU的執行效率,減少因為程式等待帶來的CPU空轉以及其他計算機軟硬體資源的浪費而提出來的。 二、為什麼引入執行緒? 為了減少程序切換和建立的開銷,提高執行效率和節省
程序與執行緒的同步方式
1、執行緒同步: 臨界區(Critical Section)、互斥量(Mutex)、訊號量(Semaphore)、事件(Event) 1)、臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。在任意時刻只允許一個執行緒對共享資源進行訪問,如
程序和執行緒——Python中的實現
一、程序(Process) 程序是一個實體。每一個程序都有它自己的地址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和程序執行期間使用的動
Quartz原始碼分析(一)------ 以執行緒等待的方式實現按時間排程
Quartz是運用最廣的任務排程框架,它最核心的組成部分是Scheduler、Trigger、JobDetail,然後給Scheduler配置個執行緒QuartzSchedulerThread,此執行緒在Scheduler初始化時啟動,等待Scheduler start,然後
redis面試題集錦 Redis為什麼使用單程序單執行緒方式也這麼快
1為什麼Redis需要把所有資料放到記憶體中? Redis為了達到最快的讀寫速度將資料都讀到記憶體中,並通過非同步的方式將資料寫入磁碟。所以Redis具有快速和資料持久化的特性。如果不將資料放到記憶體中,磁碟的I/O速度會嚴重影響redis的效能。在記憶體越來越便宜的今天,redis將會越來越受歡迎。如果設
單程序單執行緒實現
今天嘗試著僅使用單程序、單執行緒、不用協程就完成多工的web伺服器簡單程式設計。問題多多,收穫多多。首先放上核心程式碼 整體思路是沒有問題的但是其間出現了很多小問題,這裡就想記錄一下: 1.程式一開始執行的時候,連線成功,但是無論怎麼發資料,都接收不到 檢查發現是程式碼中,由於一開始思路
單程序單執行緒的Redis如何能夠高併發
1、基本原理 採用多路 I/O 複用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路IO的時間消耗) (1)為什麼不採用多程序或多執行緒處理?多執行緒處理可能涉及到鎖 多執行緒處理會涉及到執行緒切換而消耗CPU(2)單執行緒處理的缺點?無法發揮多核CPU效能,不過可以
單程序單執行緒,完成併發伺服器(select版)
# 單程序單執行緒,利用select函式完成併發伺服器 from select import * from socket import * def main(): serverSocket
java架構之路(多執行緒)大廠方式手寫單例模式
上期回顧: 上次部落格我們說了我們的volatile關鍵字,我們知道volatile可以保證我們變數被修改馬上刷回主存,並且可以有效的防止指令重排序,思想就是加了我們的記憶體屏障,再後面的多執行緒部落格裡還有說到很多的屏障問題。 volatile雖然好用,但是別用的太多,咱們就這樣想啊,
程序/執行緒同步的方式和機制,程序間通訊【轉】
(轉自:https://www.cnblogs.com/virusolf/p/5331946.html) 一、程序/執行緒間同步機制。 臨界區、互斥區、事件、訊號量四種方式臨界區(Critical Section)、互斥量(Mutex)、訊號量(Semaphore)、事件(Event)的區別
程序間,執行緒間的通訊方式及程序與執行緒的區別
近日想總結下程序間,執行緒間的通訊方式,在網上搜索了下,感覺寫的很好,照搬過來,當做加深記憶。 幾種程序間的通訊方式 (1) 管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。 (2)有名管道(named p
cuda 單block多執行緒
cuda單block多thread的實現 #include <iostream> #include <cuda_runtime.h> #include <stdio.h> #include <time.h> #include <stdlib.
Java 單例模式執行緒安全問題
Java 單例模式執行緒安全問題 更新時間:2017年09月14日 11:30:42 作者:flycw 我要評論 這篇文章主要介紹了Java 單例模式執行緒安全問題的相關資料,希望通過本文大家能瞭解掌握單例模式中
面試必問:程序與執行緒的異同以及程序間通訊方式
秋招面試必問的題目,感覺今年被問了差不多10次了。 1.程序與執行緒 程序:具有獨立功能的程式關於某個資料集合上的一次執行活動。 執行緒:程序的一個實體。 比喻:一列火車是一個程序,火車的每一節車廂是執行緒。 2.程序與執行緒的聯絡 ①一個執行緒只能屬於一個程序,一個程序
java多執行緒學習(十一) 常見的單例模式執行緒安全性分析
類初始化鎖 怎麼理解? 為什麼需要了解? 常見的單例模式分析 懶漢式 為什麼執行緒不安全 驗證 餓漢式 為什麼執行緒安全 雙重檢查鎖定方式 演變由來 為什麼執行緒不安全 如何解決執行緒不安全 靜態類方式 為什麼執行緒安全 結
python中socket、程序、執行緒、協程、池的建立方式和應用場景
程序 場景 利用多核、高計算型的程式、啟動數量有限 程序是計算機中最小的資源分配單位 程序和執行緒是包含關係 每個程序中都至少有一條執行緒 可以利用多核,資料隔離
程序、執行緒間的幾種通訊方式
一、程序通訊 幾種程序間的通訊方式 (1) 管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。 (2)有名管道(named pipe):有名管道也是半雙工的通訊方式,但是它允許無