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

2014-05-09 11:20:34 +08:00
 Matrix24
服务端的基本模型如下,三个点表示空格,为了维持排版用的

简单的介绍:
服务器建立了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继续监听?
3851 次点击
所在节点    Python
4 条回复
ospider
2014-05-09 11:37:47 +08:00
哈哈,刚刚用python写完网络实验作业的来给你解答了:
简单来说就是 2
accept这个方法真是个神坑,这时候你的主线程是阻塞在内核的,也就是你用Ctrl+C也无法停止主线程;
当系统从这个方法里返回后,也就是有了conn和addr,上面的代码就接着运行;
创建thread这个和普通的代码没区别,创建完了,主线程接着运行就是了,也就是你的主循环会再次阻塞到accept;
多线程之间的调度,是有系统进行的,理论上是并发的,但是由于GIL的限制,python同时只能有一个线程在跑。
est
2014-05-09 12:42:45 +08:00
@ospider 本人在国内看到关于GIL的说法,没有哪一次是说对了的。

其他语言也有诸多多线程的限制,为毛就python的GIL出名了?
alsotang
2014-05-09 12:53:39 +08:00
@est ruby的也出名
Matrix24
2014-05-09 13:06:53 +08:00
@ospider 十分感谢!!就缺了这一环~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/111737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX