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
fujian
V2EX  ›  Python

初步学习了 python 的 Socket 模块,有一些疑惑请大家指教

  •  
  •   fujian · 2016-03-18 18:41:43 +08:00 · 3173 次点击
    这是一个创建于 3175 天前的主题,其中的信息可能已经有所发展或是发生改变。

    做了一年的 Python 职业码农,平常只是做做 web api 之类的东西,近期有时间准备从头了解一下 python 的模块,既然是 web ,就先从 socket 看起,一方面让我想到大学里面学过的网络七层框架(想想就头疼)。照着网上的 demo 写了实现 TCP 和 UDP 的 client 和 server 模式。

    每次新认知一样事物都是要和之前学过的东西联系起来,所以就有一些疑惑:

    1. 有经验的同学通过 socket 做过什么比较有趣的东西?现在的感觉就是在理论级别认知和理解,感觉无法联系到应用啊。
    2. 貌似基于 socket 有一个框架叫 Twisted ,因为本人在生产级别接触 django , flask 这样的框架,所以很好奇有同学在生产级别用过 Twisted 吗?都是在解决什么问题?

    感谢分享,提前谢了!

    11 条回复    2016-03-20 21:42:44 +08:00
    binux
        1
    binux  
       2016-03-18 18:49:18 +08:00
    web api 不是 socket 的应用了吗? web 职业码农连本都忘了吗?
    fujian
        2
    fujian  
    OP
       2016-03-18 19:30:12 +08:00
    @binux 哈哈,确实是!
    clino
        3
    clino  
       2016-03-18 19:30:57 +08:00 via Android
    buildbot 是用 twisted 开发的 我用的很多
    不过 twisted 的异步开发方式个人很讨厌
    fujian
        4
    fujian  
    OP
       2016-03-18 19:58:53 +08:00
    @clino 是因为设计模式吗?
    clino
        5
    clino  
       2016-03-18 20:20:17 +08:00   ❤️ 3
    @fujian twisted 是事件驱动的网络异步编程框架,要写很多 callback,可维护性可读性不好,还是用 gevent 这种协程类的异步编程框架比较好,gevent 中文教程: http://xlambda.com/gevent-tutorial/

    不过 twisted 的功能非常全和强大: http://twistedmatrix.com/documents/current/api/moduleIndex.html

    而 gevent 主要是异步编程方面的库,覆盖的范围没有那么多: http://twistedmatrix.com/documents/current/api/moduleIndex.html
    cc7756789
        6
    cc7756789  
       2016-03-18 20:46:06 +08:00
    flask 和 webpy 都是基于标准库 SimpleServer -> BaseHTTPServer -> SocketServer 的吧, SocketServer 就是基于 socket 的, socket 基于_socket ,再下面应该就是 CPython 的实现了,调用的肯定是 C 库。 Socket 这种东西,底层还是基于 TCP/IP 协议,往往是最恶心的,协议我是看不下去的。
    guyskk
        7
    guyskk  
       2016-03-18 21:11:32 +08:00
    1. 写过一个批量扫描 ip 的,发现学校许多奇奇怪怪的网站。用 urllib 之类的实现会很慢, socket 效率高。
    2. shadowsocks 值得研究一下,重点是事件循环( eventloop , tornado 里面叫 ioloop )和网络协议, socket 本身不难。
    billlee
        8
    billlee  
       2016-03-18 22:19:47 +08:00
    @cc7756789 Flask 是基于 WSGI 的
    clino
        9
    clino  
       2016-03-19 13:29:52 +08:00
    上面 gevent 链接贴错成 twisted 的了: http://www.gevent.org/reference.html
    cc7756789
        10
    cc7756789  
       2016-03-20 14:37:50 +08:00
    @billlee WSGI 只是一种协议,一种标准,而不是某个库
    billlee
        11
    billlee  
       2016-03-20 21:42:44 +08:00
    @cc7756789 Flask 是基于 wsgiref 的,那个 http server 只是方便调试用的工具。当用 uwsgi 等方式运行运行时就是通过 WSGI 调用的,和标准库里的 http server 一点关系都没有。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3648 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.