更多课程 选择中心


Python培训

400-996-5531

PythonWebServer如何同时处理多个请求


对于初学Web开发,理解一个web server如何能同事处理多个请求很重要。当然更重要的是,理解你通过浏览器发送的请求web server是怎么处理的,然后怎么返回给浏览器,浏览器才能展示的。

我到现在还记得大概在2010年左右,看了tomcat源码之后,那种豁然开朗的感觉(对,当时我还在写Java)。搞技术的人,总是希望花点时间,能够更透彻的看透整个网络世界的构成,而不是那啥。

要理解web server如何能处理多个请求有两个基本要素

第一,知道怎么通过socket编程,这也是我在视频中强调的一点,理解这点之后再去看看WSGI,你就知道Python世界中大部分的框架怎么运作了。

第二,多线程编程,理解了这个,你才能知道怎么着我起了一个web server,就能处理多个请求。 多进程也是一样的逻辑。

通过这两段代码,应该很好理解:

server.py 如果不太懂的话,建议保存到本地,运行下试试.

  1. # coding:utf-8

  2. import socket

  3. EOL1 = '\n\n'

  4. EOL2 = '\n\r\n'

  5. body = '''Hello, world! <h1> from the5fire 《Django企业开发实战》</h1>'''

  6. response_params = [

  7.    'HTTP/1.0 200 OK',

  8.    'Date: Sat, 10 jun 2017 01:01:01 GMT',

  9.    'Content-Type: text/plain; charset=utf-8',

  10.    'Content-Length: {}\r\n'.format(len(body)),

  11.    body,

  12. ]

  13. response = b'\r\n'.join(response_params)

  14. def handle_connection(conn, addr):

  15.    request = ""

  16.    while EOL1 not in request and EOL2 not in request:

  17.        request += conn.recv(1024)

  18.    print(request)

  19.    conn.send(response)

  20.    conn.close()

  21. def main():

  22.    # socket.AF_INET    用于服务器与服务器之间的网络通信

  23.    # socket.SOCK_STREAM    基于TCP的流式socket通信

  24.    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  25.    # 设置端口可复用,保证我们每次Ctrl C之后,快速再次重启

  26.    serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

  27.    serversocket.bind(('127.0.0.1', 8080))

  28.    # 可参考:#/questions/2444459/python-sock-listen

  29.    serversocket.listen(1)

  30.    print('http://127.0.0.1:8080')

  31.    try:

  32.        while True:

  33.            conn, address = serversocket.accept()

  34.            handle_connection(conn, address)

  35.    finally:

  36.        serversocket.close()

  37. if __name__ == '__main__':

  38.    main()

  1. python server.py

试试。

2 thread_server.py 开多个tab,同时打开试试.

  1. # coding:utf-8

  2. import socket

  3. import threading

  4. import time

  5. EOL1 = '\n\n'

  6. EOL2 = '\n\r\n'

  7. body = '''Hello, world! <h1> from the5fire 《Django企业开发实战》</h1> - from {thread_name}'''

  8. response_params = [

  9.    'HTTP/1.0 200 OK',

  10.    'Date: Sat, 10 jun 2017 01:01:01 GMT',

  11.    'Content-Type: text/plain; charset=utf-8',

  12.    'Content-Length: {length}\r\n',

  13.    body,

  14. ]

  15. response = b'\r\n'.join(response_params)

  16. def handle_connection(conn, addr):

  17.    request = ""

  18.    while EOL1 not in request and EOL2 not in request:

  19.        request += conn.recv(1024)

  20.    # print(request)

  21.    current_thread = threading.currentThread()

  22.    content_length = len(body.format(thread_name=current_thread.name))

  23.    print(current_thread.name, '-------', 'sleep 10', int(time.time()))

  24.    time.sleep(10)

  25.    conn.send(response.format(thread_name=current_thread.name, length=content_length))

  26. conn.close()

  27. def main():

  28.    # socket.AF_INET    用于服务器与服务器之间的网络通信

  29.    # socket.SOCK_STREAM    基于TCP的流式socket通信

  30.    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  31.    # 设置端口可复用,保证我们每次Ctrl C之后,快速再次重启

  32.    serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

  33.    serversocket.bind(('127.0.0.1', 8080))

  34.    # 可参考:#/questions/2444459/python-sock-listen

  35.    serversocket.listen(10)

  36.    print('http://127.0.0.1:8080')

  37.    try:

  38.        i = 0

  39.        while True:

  40.            i += 1

  41.            conn, address = serversocket.accept()

  42.            t = threading.Thread(target=handle_connection, args=(conn, address), name='thread-%s' % i)

  43.            t.start()

  44.    finally:

  45.        serversocket.close()

  46. if __name__ == '__main__':

  47.    main()

试试吧,与其着急去学习框架不如先弄懂这个。

参考

WSGI——Web框架基础 - 《Django企业开发实战草稿》

Python官方库的socketserver源码

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:从零开始搭建 Python 开发环境
下一篇:python又搞事了,冲顶大会还能这么玩

Python IDE推荐7个你可能会错过的Python IDE

Python面试题之Python中爬虫框架或模块的区别

2021年Python面试题及答案汇总详解

python数据分析,你需要这些工具

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省