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

2018-06-04 09:58:29 +08:00
 misaka19000

我在进行网络编程的时候需要使用到 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 环境就做特殊的处理。 以上代码是可以正常使用的,但是感觉不够优雅,不知道各位有没有什么比较优雅的解决方案🤔

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

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

def on_start():
if self.is_linux():
pass
lihongjie0209
2018-06-04 10:41:06 +08:00
@misaka19000 #5 重复代码放到一个超类中
raptor
2018-06-04 10:50:52 +08:00
有现成的包装为什么要自己写底层操作?
BBCCBB
2018-06-04 10:52:47 +08:00
python3.4 之后有一个模块叫 selectors, 就是适配了多个平台的 select 模型, 同一套 api 操作 select, epoll, kqueue 等, 而且自动选择最优的模型
misaka19000
2018-06-04 10:53:58 +08:00
@raptor #8 请问有什么包呢?
misaka19000
2018-06-04 11:29:37 +08:00
@BBCCBB #9 在 python2 中是不是没有办法使用?
BBCCBB
2018-06-04 11:49:01 +08:00
@misaka19000 应该在 python2 中没法用, 我不熟悉 python2 呢
zjb861107
2018-06-04 11:53:47 +08:00
把 Linux 部分需要特殊处理的代码,通过装饰器来实现??
lolizeppelin
2018-06-04 12:11:34 +08:00
参考 eventlet poll 部分代码即可
raptor
2018-06-08 11:14:00 +08:00
@misaka19000 我的意思是封装了 epoll 的网络操作包有很多,不知道你有什么不一样的网络操作需要做这样底层的开发,如果真有这种需要,我个人认为并不适合用 python 来做
misaka19000
2018-06-08 11:23:18 +08:00
@raptor 我是需要开发一个 Python 的 RPC 框架,不知道有没有什么比较合适的库推荐呢?
lolizeppelin
2018-06-12 10:46:11 +08:00
照抄 openstack 的 oslo message

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

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

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

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

© 2021 V2EX