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

请问 Python 大神, Python 跨平台的代码应该怎么写比较优雅?

  •  
  •   misaka19000 ·
    RitterHou · 2018-06-04 09:58:29 +08:00 · 2913 次点击
    这是一个创建于 2351 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在进行网络编程的时候需要使用到 select 模型,同时如果平台是 Linux 就使用 epoll 模型,所以我需要对 Linux 平台的代码做特殊处理,目前我的代码是这样的:

    if is_linux():
        self.__fds = {}
        self.__epoll = select.epoll()
    
    if is_linux():
        conn = self._connection_pool[host]
        self.__epoll.register(conn.fileno(), select.EPOLLIN)
        self.__fds[conn.fileno()] = conn
    
    if is_linux():
        while 1:
            events = self.__epoll.poll(1)
    else:
        while 1:
            readable, writeable, exceptional = select.select(conns, [], [])
    
    if conn.close():  # 连接已关闭
        if is_linux():
            self.__epoll.unregister(conn.fileno())
    

    我是对所有需要用到 epoll 的地方添加了环境判断,如果是 linux 环境就做特殊的处理。 以上代码是可以正常使用的,但是感觉不够优雅,不知道各位有没有什么比较优雅的解决方案🤔

    17 条回复    2018-06-12 10:46:11 +08:00
    kinghui
        1
    kinghui  
       2018-06-04 10:13:33 +08:00
    BBCCBB
        2
    BBCCBB  
       2018-06-04 10:27:42 +08:00   ❤️ 1
    import selectors
    lihongjie0209
        3
    lihongjie0209  
       2018-06-04 10:32:46 +08:00
    一个接口多个实现类
    misaka19000
        4
    misaka19000  
    OP
       2018-06-04 10:35:33 +08:00
    @BBCCBB #2 请问能不能再具体一点?
    misaka19000
        5
    misaka19000  
    OP
       2018-06-04 10:37:24 +08:00
    @lihongjie0209 #3 这个我倒是想过,但是因为大部分代码其实重复的,所以如果分为多个类将会导致这些类中会与比较多的重复代码,感觉还是不够好
    chroming
        6
    chroming  
       2018-06-04 10:40:35 +08:00   ❤️ 1
    把所有 is_linux 的代码封装为一个类的不同方法

    class SysSelect(object):
    def __init__():
    self.is_linux = is_linux()

    def on_start():
    if self.is_linux():
    pass
    lihongjie0209
        7
    lihongjie0209  
       2018-06-04 10:41:06 +08:00
    @misaka19000 #5 重复代码放到一个超类中
    raptor
        8
    raptor  
       2018-06-04 10:50:52 +08:00
    有现成的包装为什么要自己写底层操作?
    BBCCBB
        9
    BBCCBB  
       2018-06-04 10:52:47 +08:00
    python3.4 之后有一个模块叫 selectors, 就是适配了多个平台的 select 模型, 同一套 api 操作 select, epoll, kqueue 等, 而且自动选择最优的模型
    misaka19000
        10
    misaka19000  
    OP
       2018-06-04 10:53:58 +08:00
    @raptor #8 请问有什么包呢?
    misaka19000
        11
    misaka19000  
    OP
       2018-06-04 11:29:37 +08:00
    @BBCCBB #9 在 python2 中是不是没有办法使用?
    BBCCBB
        12
    BBCCBB  
       2018-06-04 11:49:01 +08:00
    @misaka19000 应该在 python2 中没法用, 我不熟悉 python2 呢
    zjb861107
        13
    zjb861107  
       2018-06-04 11:53:47 +08:00
    把 Linux 部分需要特殊处理的代码,通过装饰器来实现??
    lolizeppelin
        14
    lolizeppelin  
       2018-06-04 12:11:34 +08:00 via Android
    参考 eventlet poll 部分代码即可
    raptor
        15
    raptor  
       2018-06-08 11:14:00 +08:00
    @misaka19000 我的意思是封装了 epoll 的网络操作包有很多,不知道你有什么不一样的网络操作需要做这样底层的开发,如果真有这种需要,我个人认为并不适合用 python 来做
    misaka19000
        16
    misaka19000  
    OP
       2018-06-08 11:23:18 +08:00
    @raptor 我是需要开发一个 Python 的 RPC 框架,不知道有没有什么比较合适的库推荐呢?
    lolizeppelin
        17
    lolizeppelin  
       2018-06-12 10:46:11 +08:00 via Android
    照抄 openstack 的 oslo message
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2651 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.