学习Python并尝试做一些雄心勃勃的事情(可能太多了)。
该应用程序(控制台,像服务器一样静默运行),需要与2个串行端口通信,需要处理定时器,需要在Redis KV存储上推送信息,编写日志,并使用unix IPC(或socket comm)与其他类似的应用程序交互
在我看来,考虑这样一个应用程序更简单的方法是使用线程和事件队列。然而,由于我所理解的GIL对线程的强制限制,它不是Python的一个选项(除非我误解了一些事情)。我所理解的另一种方法是使用异步I/O框架、绿色线程、协同程序等。
对于我打算编写的异步事件驱动编程,twisted、gevent和asyncoro在Python中真的是替代品吗?
由于学习扭曲似乎是一项巨大的投资(就时间/精力而言),我想知道gevent和asyncoro是否可以更容易、更好地替代?从目前为止所做的一些肤浅的文档阅读来看,asyncoro似乎是最简单的,新学习的数量非常有限,而Twisted则是另一个极端,gevent处于中间位置——但我不确定它们是否真的具有可比性。
下面是一个应用程序在多线程情况下会做什么的例子:
- 线程:1-定期监测串行端口的运行状况,即使用计时器。假设每2分钟检查一次上次状态是否正常。如果最后一种状态不健康,那么在前5分钟每30秒检查一次,然后在接下来的10分钟每分钟检查一次。。。就像指数后退一样。请注意,有多个这样的串行端口
- 线程:2-监控不时通过串行端口来和去的应用程序级会话的状态,以及通过串行端口发生的通信。Redis(计划)用于向分布式KV存储写入。其他应用程序实例(运行在相同或其他服务器上),可以协调某些其他操作
- 线程:3-执行一些其他内务管理任务
所有线程都需要进行日志记录,所有线程都使用计时器(以及其他事件)来做某些事情。定时器用于某些逻辑的周期性执行,并作为保护某些操作(阻塞或非阻塞)的超时。
我对Python的经验非常有限,但我有用C/C++和Java编写类似程序的经验。使用Python来学习。
您可以使用这里提到的任何库来实现您所描述的应用程序。您也可以使用传统线程。GIL阻止您在执行Python字节码操作时实现硬件级别的并行性(例如,与从Python程序调用的本地代码不同)。它不会阻止您执行并行I/O操作——这听起来像是您的应用程序主要关心的问题。
你的问题中没有足够的细节来推荐其中一种工具而不是另一种工具(如果有足够的细节,这个问题可能会非常庞大,正确回答的努力可能会阻止SO上的任何人这样做)。不过,通常可以肯定地说,线程方法可能是最糟糕的(出于各种原因,我甚至不会试图在这里解释;它们在互联网上已经有足够好的记录)。