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