【问题标题】:a static web server demo used gevent in python在 python 中使用 gevent 的静态 Web 服务器演示
【发布时间】:2019-04-06 10:52:25
【问题描述】:

我在 python 中使用 gevent 的静态 web 服务器演示存在一些问题。当我的浏览器使用 http://localhost:8080.It 访问我的 web 服务器时没有任何响应。如果我的静态 web 服务器演示不使用 gevent,它运行良好,肯定是gevent出了点问题。

#coding=utf-8
from socket import *
from gevent import monkey
import re
import gevent

monkey.patch_all()

def handle_client(client_socket):

    recv_data = client_socket.recv(1024).decode("utf-8")
    response_header_lines = recv_data.splitlines()
    for line in response_header_lines:
        print(line)

    http_request_line = response_header_lines[0]
    get_file_name = re.match("[^/]+(/[^ ]*)", http_request_line).group(1)
    print("file name is ===>%s"%get_file_name)  #for test

    if get_file_name == "/":
        get_file_name = DOCUMENTS_ROOT + "/index.html"
    else:
        get_file_name = DOCUMENTS_ROOT + get_file_name

    print("file name is ===2>%s"%get_file_name)

    try:
        f = open(get_file_name, "rb")
    except IOError:
        response_header = "HTTP/1.1 404 not found\r\n"
        response_header += "\r\n"
        response_body = "404 not found"
    else:
        response_header = "HTTP/1.1 200 OK\r\n"
        response_header += "\r\n"
        response_body = f.read()
        f.close()
    finally:
        client_socket.send(response_header.encode("utf-8"))
        client_socket.send(response_body)
        client_socket.close()

def main():

    server_socket = socket(AF_INET, SOCK_STREAM)
    server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    server_socket.bind(("", 8080))
    server_socket.listen(128)
    while True:
        client_socket, client_addr = server_socket.accept()
        #handle_client(client_socket)
        gevent.spawn(handle_client, client_socket)

    server_socket.close()

DOCUMENTS_ROOT = "./html"

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python gevent


    【解决方案1】:

    你应该应用猴子补丁之前导入任何将被打补丁的模块,socket 这里有问题:

    from gevent import monkey
    monkey.patch_all()
    
    from socket import *
    
    ...
    

    its doc强调:

    应在生命周期内尽早完成修补 程序。例如,主模块(针对 ma​​in 或者是第一个导入的)应该以此代码开头,最好在任何其他导入之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 2013-08-19
      • 2017-03-05
      • 2014-12-29
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多