Answers:
我喜欢使用Jonathan提出的标准工具的方法。您没有提到要在哪个OS上进行工作,但是遵循相同精神的另一种选择可能是与Python的标准日志记录模块一起使用logging.handlers.SysLogHandler
,并将日志记录消息发送到rsyslog服务(可在任何linux / unix上使用,但我认为还有一个Windows选项,但我从未使用过该选项)。
本质上,整个系统实现了您正在考虑的同一件事。您的本地进程将日志消息排队,由其他人处理/处理/编写。在这种情况下,别人(rsyslog
)是一项众所周知的成熟服务,它具有许多内置功能和灵活性。
这种方法的另一个优点是您的产品将与基于syslog的其他sysadmin工具更好地集成。而且它甚至不需要您编写任何代码即可获得该选项。
您可能要考虑实现远程日志记录的第三种可能性。如果使用标准的Python日志记录模块,则可以考虑logging.QueueHandler
在worker,客户端和代理中使用该类,并logging.QueueListener
在远程日志记录过程中使用该类。
与其使用普通的Python multiprocessing.Queue
作为应用程序进程和日志记录进程之间的传输方式,不如Queue
使用ZeroMQ和鸭子类型来实现自己的替换类,以使您的类成为标准Python的直接替代品Queue
。这样,您的应用程序将能够从一台多核计算机到分布式数据中心,在任何环境中保持不变。
总而言之,将标准Python记录器与QueueHandler
您的所有工作人员,客户和经纪人一起使用,并基于QueueListener
和logging
您选择的Python 处理程序创建一个独立的进程来处理繁重的记录。
这些是截然不同的方法,每种方法各有优缺点,您很可能会在以后的开发阶段看到这些方法:
我想到了两种方法:
- 创建仅用于日志记录的工作程序并使用ZeroMQ IPC传输
- 与队列一起使用多处理
您可以尝试的一种方法是,像方法1一样,有一个额外的日志记录工作程序。您可以让您的工作程序登录到Memcache日志记录群集,并且日志记录工作程序监视当前资源负载,并在超过给定的资源负载参数时监视该资源负载。工人登录到IOPs受限设备(例如硬盘)。
我也喜欢乔纳森(Jonathan)的方法,我只使用了Python 2.x,但您可能必须设置自己的日志记录后端才能真正提高性能。
如果我错了,请纠正我,但是我的看法是您正在执行一些真正的数据密集型任务,而存储IOP是您的瓶颈。
一种方便的方法仍然是让代理brokerage
以所描述的形式进行日志记录,同时具有中央代理实例的所有缺点。例如,如果代理人的需求如此之高,以至于它再也没有喘息的机会将内存缓存的日志写回到存储中,那么您就需要采取另一种方法。
您最终可能最终会获得无经纪人模型。那就是工人在自己之间管理工作。在一个简单的示例中,通过分布式轮询算法。