Twisted,genvent,asyncoro - 他们可能需要什么?

时间:2015-04-15 11:51:52

标签: python multithreading event-handling twisted coroutine

学习Python并尝试做一些雄心勃勃的事情(也许是太多)。

应用程序(控制台,像服务器一样静默运行),需要与2个串口通信,需要处理定时器,需要在Redis KV-store上推送信息,写日志,以及与其他类似的串口交互使用unix IPC(或socket comm。)的应用程序

考虑这样一个应用程序的更简单方法(在我看来)是使用线程和事件队列。但是由于我理解为GIL强制执行线程限制,因此它不是Python的一个选项(除非,我误解了事情)。另一种方法,我所理解的 - 是使用异步I / O框架,绿线程,协同程序等。

twistedgeventasyncoro是否真的可以替代我打算编写的异步事件驱动编程?

由于学习扭曲似乎是一项巨大的投资(在时间/精力方面),我想知道gevent和asyncoro是否可以更容易和更好的选择?从目前为止所做的表面文档阅读来看,asyncoro似乎是最简单的,新学习的数量非常有限,Twisted是另一种极端,而gevent在中间的某个地方 - 但后来我不确定,如果他们是真的可比。

以下是应用程序在多线程时将执行的操作的示例:

  • 线程:1 - 定期监视串口的健康状况,即使用计时器。如果最后状态健康,请每2分钟检查一次。如果最后状态不健康,那么前30分钟检查前5分钟,接下来10分钟检查每分钟......就像指数退避一样。请注意,有多个这样的串行端口。
  • 线程:2 - 监视通过串行端口不时出现的应用程序级会话的状态,以及通过它进行的通信。 Redis(计划)用于写入分布式KV-store s.t.其他应用程序实例(在相同或其他服务器上运行)可以协调某些其他操作。
  • 主题:3 - 执行其他一些内务处理任务。

所有线程都需要进行日志记录,所有线程都使用计时器(和其他事件)来执行某些操作。定时器用于定期执行某些逻辑,并用作超时以保护某些操作(阻塞或非阻塞)。

我对Python的经验非常有限,但我有使用C / C ++和Java编写类似程序的经验。使用Python来学习。

1 个答案:

答案 0 :(得分:1)

您可以使用此处提及的任何库来实施您所描述的应用程序。您也可以使用传统线程。 GIL阻止您在执行Python字节代码操作时实现硬件级并行(与从Python程序调用的本机代码不同)。它不会阻止您执行并行I / O操作 - 这听起来就像您的应用程序主要关注的那样。

在你的问题中没有足够的细节提供这些工具之一的推荐(如果有足够的细节,问题可能是巨大的,正确回答它的努力可能会阻止任何人在这样做的时候)。通常可以肯定的是,线程方法可能是最糟糕的(由于各种原因,我甚至试图在这里尝试消失;它们在互联网上的记录得很好)。