【问题标题】:Twisted, genvent, asyncoro - are they what I might need?Twisted、genvent、asyncoro - 它们是我可能需要的吗?
【发布时间】:2015-04-15 11:51:52
【问题描述】:

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

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

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

对于我打算编写的异步事件驱动编程,twistedgeventasyncoro 真的是 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 进行学习。

【问题讨论】:

  • 您还应该考虑asyncio/trollius(asyncio 是 python3,trollius 是 python2 反向端口)。
  • 感谢您指向“trollius”,不知道 python2 中提供了 asyncio 反向端口。确实,我遇到了 Python3 的 asyncio。
  • 什么是“异步”?你的问题应该有更多的链接。

标签: python multithreading event-handling twisted coroutine


【解决方案1】:

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

您的问题中没有足够的细节来推荐其中一个工具而不是另一个(如果有足够的细节,这个问题可能会很大,正确回答它的努力可能会阻止任何人在 SO这样做)。不过,通常可以肯定地说,线程方法可能是最糟糕的(出于各种原因,我什至不会尝试在这里进行解释;它们在整个互联网上都有很好的记录)。

【讨论】:

  • 感谢让-保罗。 GIL 有效地使多核/处理器不被使用,而是只使用一个内核,而操作系统确实使用单处理器执行抢占式多任务处理,这是次优的(与所有其他可以使用的内核相比) )。 Python 线程确实映射到基于堆栈的 OS 线程,因此接近进程级上下文切换的成本/效率。这是正确的理解吗?
  • 另外,关于这 3 个替代品的一个担忧(或问题)是,除了 Twisted,其他 2 个似乎不支持(尽管没有强有力的证据表明被禁止)连续剧i/o(pyserial 或任何替代方法)。我仍然不确定的部分是,如果 gevent 或 asyncoro 或者说甚至是 trollius 中有任何内容,这会阻止我在同一个应用程序中使用 pyserial。
  • 将阅读/研究更多关于 Python 线程的内容以及为什么这是一个糟糕的想法,但我收到了警告。
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多