1. 程式人生 > >單程序單執行緒非堵塞方式實現http伺服器

單程序單執行緒非堵塞方式實現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):有名管道也是半雙工的通訊方式,但是它允許無