【发布时间】:2015-04-15 11:51:52
【问题描述】:
学习 Python 并尝试做一些雄心勃勃的事情(也许太过分了)。
应用程序(控制台,像服务器一样静默运行),需要与 2 个串行端口通信,需要处理定时器,需要在 Redis KV-store 上推送信息,写入日志,以及与其他类似的交互使用 unix IPC(或套接字通信)的应用程序。
(在我看来)考虑这样一个应用程序的更简单的方法是使用线程和事件队列。然而,由于我理解 GIL 对线程的强制限制,它不是 Python 的一个选项(除非我误解了一些事情)。另一种方法,我所理解的 - 是使用异步 I/O 框架、绿色线程、协程等。
对于我打算编写的异步事件驱动编程,twisted、gevent 和 asyncoro 真的是 Python 中的替代品吗?
由于学习 twisted 似乎是一项巨大的投资(就时间/精力而言),我想知道 gevent 和 asyncoro 是否可以更容易和更好的选择?从到目前为止完成的一些肤浅的文档阅读来看,asyncoro 似乎是最简单的,新的学习量非常有限,而 Twisted 是另一个极端,gevent 处于中间位置——但我不确定它们是否是真的有可比性。
这是一个应用程序在多线程时会做什么的示例:
- Thread:1 - 定期监控串行端口的健康状况,即使用计时器。如果最后一个状态是健康的,请每 2 分钟检查一次。如果最后一个状态不健康,则在前 5 分钟每 30 秒检查一次,然后在接下来的 10 分钟每分钟检查一次……就像指数退避一样。请注意,有多个这样的串行端口。
- Thread:2 - 监控不时通过串行端口来来往往的应用程序级会话的状态,以及通过它发生的通信。 Redis (计划)用于写入分布式 KV 存储 s.t.应用程序的其他实例(在相同或其他服务器上运行)可以协调某些其他操作。
- 线程:3 - 执行其他一些内务处理任务。
所有线程都需要进行日志记录,所有线程都使用计时器(和其他事件)来做某些事情。计时器用于定期执行某些逻辑并作为超时来保护某些操作(阻塞或非阻塞)。
我在 Python 方面的经验非常有限,但我有使用 C/C++ 和 Java 编写类似程序的经验。为此使用 Python 进行学习。
【问题讨论】:
-
感谢您指向“trollius”,不知道 python2 中提供了 asyncio 反向端口。确实,我遇到了 Python3 的 asyncio。
-
什么是“异步”?你的问题应该有更多的链接。
标签: python multithreading event-handling twisted coroutine