V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Matrix24
V2EX  ›  Python

在 python 中使用 socket 模块构建客户端、服务器脚本,如何理解服务器中,在接受多个客户端请求时候的运行状态(accept,多线程)?

  •  
  •   Matrix24 · 2014-05-09 11:20:34 +08:00 · 4003 次点击
    这是一个创建于 3849 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务端的基本模型如下,三个点表示空格,为了维持排版用的

    简单的介绍:
    服务器建立了TCP连接,捆绑了本地地址
    然后无限循环
    循环中使用accept
    ...然后开启,两个独立线程,分别进行收、发信息。
    ------------------
    服务端
    server=socket.socket()
    ...|
    bind(Addr)
    ...|
    listen(5)
    ...|
    while True:
    ...conn,addr = accept()

    ...thread_send = MyThread(conn,addr)
    ...thread_recv = MyThread(conn,addr)

    ...thread_send.start()
    ...thread_recv.start()

    server.close()

    问题:
    1.当一个客户进来的时候:
    ...进入监听listen队列
    ...accept是一直处于暂停状态即阻塞,CPU并不在这里无限循环,而是等待(这是我后来知道的)
    ...这个时候来了一个客户端,accept建立连接返回conn,addr
    ...执行两个线程
    >>>该如何理解这地方:
    ...1)是必须要等待两个线程结束,accept才能重新接收来自新的客户端的请求
    ...2)还是,建立完两个线程之后,accept继续监听?
    4 条回复    2014-05-09 13:06:53 +08:00
    ospider
        1
    ospider  
       2014-05-09 11:37:47 +08:00   ❤️ 1
    哈哈,刚刚用python写完网络实验作业的来给你解答了:
    简单来说就是 2
    accept这个方法真是个神坑,这时候你的主线程是阻塞在内核的,也就是你用Ctrl+C也无法停止主线程;
    当系统从这个方法里返回后,也就是有了conn和addr,上面的代码就接着运行;
    创建thread这个和普通的代码没区别,创建完了,主线程接着运行就是了,也就是你的主循环会再次阻塞到accept;
    多线程之间的调度,是有系统进行的,理论上是并发的,但是由于GIL的限制,python同时只能有一个线程在跑。
    est
        2
    est  
       2014-05-09 12:42:45 +08:00
    @ospider 本人在国内看到关于GIL的说法,没有哪一次是说对了的。

    其他语言也有诸多多线程的限制,为毛就python的GIL出名了?
    alsotang
        3
    alsotang  
       2014-05-09 12:53:39 +08:00
    @est ruby的也出名
    Matrix24
        4
    Matrix24  
    OP
       2014-05-09 13:06:53 +08:00
    @ospider 十分感谢!!就缺了这一环~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 00:02 · PVG 08:02 · LAX 16:02 · JFK 19:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.