神剑山庄资源网 Design By www.hcban.com
引子
之前clubot使用的pyxmpp2的默认mainloop也就是一个poll的主循环,但是clubot上线后资源占用非常厉害,使用strace跟踪发现clubot在不停的poll,查看pyxmpp2代码发现pyxmpp2的poll在使用超时阻塞时使用最小超时时间,而最小超时时间一直是0,所以会变成一个没有超时的非阻塞poll很浪费资源,不打算更改库代码,所以自己仿照poll的mainloop写了一个更加高效的epoll的mainloop
实现
#!/usr/bin/env python # -*- coding:utf-8 -*- # # Author : cold # E-mail : wh_linux@126.com # Date : 13/01/06 10:41:31 # Desc : Clubot epoll mainloop # from __future__ import absolute_import, division import select from pyxmpp2.mainloop.interfaces import HandlerReady, PrepareAgain from pyxmpp2.mainloop.base import MainLoopBase from plugin.util import get_logger class EpollMainLoop(MainLoopBase): """ Main event loop based on the epoll() syscall on Linux system """ READ_ONLY = (select.EPOLLIN | select.EPOLLPRI | select.EPOLLHUP | select.EPOLLERR |select.EPOLLET) READ_WRITE = READ_ONLY | select.EPOLLOUT def __init__(self, settings = None, handlers= None): self.epoll = select.epoll() self._handlers = {} self._unprepared_handlers = {} self._timeout = None self._exists_fd = {} self.logger = get_logger() MainLoopBase.__init__(self, settings, handlers) return def _add_io_handler(self, handler): self._unprepared_handlers[handler] = None self._configure_io_handler(handler) def _configure_io_handler(self, handler): if self.check_events(): return if handler in self._unprepared_handlers: old_fileno = self._unprepared_handlers[handler] prepared = self._prepare_io_handler(handler) else: old_fileno = None prepared = True fileno = handler.fileno() if old_fileno is not None and fileno != old_fileno: del self._handlers[old_fileno] self._exists.pop(old_fileno, None) self.epoll.unregister(old_fileno) if not prepared: self._unprepared_handlers[handler] = fileno if not fileno: return self._handlers[fileno] = handler events = 0 if handler.is_readable(): events |= self.READ_ONLY if handler.is_writable(): events |= self.READ_WRITE if events: if fileno in self._exists_fd: self.epoll.modify(fileno, events) else: self._exists_fd.update({fileno:1}) self.epoll.register(fileno, events) def _prepare_io_handler(self, handler): ret = handler.prepare() if isinstance(ret, HandlerReady): del self._unprepared_handlers[handler] prepared = True elif isinstance(ret, PrepareAgain): if ret.timeout is not None: if self._timeout is not None: self._timeout = min(self._timeout, ret.timeout) else: self._timeout = ret.timeout prepared = False else: raise TypeError("Unexpected result from prepare()") return prepared def _remove_io_handler(self, handler): if handler in self._unprepared_handlers: old_fileno = self._unprepared_handlers[handler] del self._unprepared_handlers[handler] else: old_fileno = handler.fileno() if old_fileno is not None: try: del self._handlers[old_fileno] self._exists.pop(old_fileno, None) self.epoll.unregister(old_fileno) except KeyError: pass def loop_iteration(self, timeout = 60): next_timeout, sources_handled = self._call_timeout_handlers() if self.check_events(): return if self._quit: return sources_handled for handler in list(self._unprepared_handlers): self._configure_io_handler(handler) if self._timeout is not None: timeout = min(timeout, self._timeout) if next_timeout is not None: timeout = min(next_timeout, timeout) if timeout == 0: timeout += 1 # 带有超时的非阻塞,解约资源 events = self.epoll.poll(timeout) for fd, flag in events: if flag & (select.EPOLLIN | select.EPOLLPRI | select.EPOLLET): self._handlers[fd].handle_read() if flag & (select.EPOLLOUT|select.EPOLLET): self._handlers[fd].handle_write() if flag & (select.EPOLLERR | select.EPOLLET): self._handlers[fd].handle_err() if flag & (select.EPOLLHUP | select.EPOLLET): self._handlers[fd].handle_hup() #if flag & select.EPOLLNVAL: #self._handlers[fd].handle_nval() sources_handled += 1 self._configure_io_handler(self._handlers[fd]) return sources_handled
使用
如何使用新的mainloop"htmlcode">
mainloop = EpollMainLoop(settings) client = Client(my_jid, [self, version_provider], settings, mainloop)
这样就会使用epoll作为mainloop
注意
epoll仅仅在Linux下支持
标签:
Python
神剑山庄资源网 Design By www.hcban.com
神剑山庄资源网
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
神剑山庄资源网 Design By www.hcban.com
暂无修改Python的pyxmpp2中的主循环使其提高性能的评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年10月03日
2024年10月03日
- 孙悦.1996-伙伴【正大国际】【WAV+CUE】
- 纪钧瀚《钢琴阅读时光 雨中书店聆听轻音乐》[FLAC/分轨][399.62MB]
- 证声音乐图书馆《走向自然 疗心爵士乐》[320K/MP3][87.4MB]
- 证声音乐图书馆《走向自然 疗心爵士乐》[FLAC/分轨][184.94MB]
- 陈慧娴.2018-Priscilla-Ism演唱会3CD(2024环球红馆40复刻系列)【环球】【WAV+CUE】
- 郑秀文.1999-我应该得到(国)【华纳】【WAV+CUE】
- 陈家慧.2011-钢琴酒吧2CD【龙吟唱片】【WAV+CUE】
- 证声音乐图书馆《雨季 蓝调吉他 Rainy Blues》[320K/MP3][45.01MB]
- 证声音乐图书馆《雨季 蓝调吉他 Rainy Blues》[FLAC/分轨][109.13MB]
- 赞多《序章》[320K/MP3][45.54MB]
- 许巍.2004-每一刻都是崭新的【步升大风】【WAV+CUE】
- 群星.2024-四方馆影视原声带【韶愔音乐】【FLAC分轨】
- 陈雷.1997-安锁咧【金圆唱片】【WAV+CUE】
- 关淑怡.2013-MY.FAVORITE.SK.3CD【环球】【WAV+CUE】
- Sweety.2006-花言乔语【丰华】【WAV+CUE】