Python Twisted、genvent、asyncoro-它们是我可能需要的吗?

Python Twisted、genvent、asyncoro-它们是我可能需要的吗?,python,multithreading,event-handling,twisted,coroutine,Python,Multithreading,Event Handling,Twisted,Coroutine,学习Python并尝试做一些雄心勃勃的事情(可能太多了) 应用程序(控制台,像服务器一样静默运行),需要与2个串行端口通信,需要处理计时器,需要在Redis KV store上推送信息,写入日志,并使用unix IPC(或套接字通信)与大量其他类似应用程序交互 (在我看来)考虑这样一个应用程序更简单的方法是使用线程和事件队列。然而,由于我理解为GIL对线程的强制限制,它在Python中并不完全是一个选项(除非我误解了这一点)。我所理解的另一种方法是使用异步I/O框架、绿色线程、协同程序等 对于我

学习Python并尝试做一些雄心勃勃的事情(可能太多了)

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

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

对于我打算编写的异步事件驱动编程,Python中是否有替代方案

由于学习twisted似乎是一项巨大的投资(就时间/精力而言),我想知道gevent和asyncoro是否是更简单、更好的选择?从目前为止所做的一点肤浅的文档阅读来看,AsiCuro似乎是最简单的,新学习的数量非常有限,扭曲是另一个极端,GEVET在中间某个地方——但我不确定,如果它们真的是可比的。

下面是一个示例,说明了如果应用程序是多线程的,该应用程序会做什么:

  • 线程:1-定期(即使用计时器)监视串行端口的运行状况。假设每2分钟检查一次最后一个状态是否正常。如果最后一个状态不健康,那么在前5分钟每30秒检查一次,然后在接下来的10分钟每分钟检查一次。。。比如指数退避。请注意,有多个这样的串行端口
  • Thread:2-监视应用程序级会话的状态,这些会话通过串行端口不时地来来去去去,以及通过串行端口进行的通信。Redis(计划)用于写入分布式KV store s.t。应用程序的其他实例(在相同或其他服务器上运行)可以协调某些其他操作
  • 线程:3-执行其他一些内务管理任务
所有的线程都需要做日志记录,所有的线程都使用定时器(和其他事件)来做某些事情。计时器用于定期执行某些逻辑,并作为超时来保护某些操作(阻塞或非阻塞)


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

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


你的问题中没有足够的细节来推荐这些工具中的一种而不是另一种(如果有足够的细节,问题可能会非常复杂,正确回答问题的努力可能会阻止任何人这样做)。通常可以肯定地说,线程方法可能是最糟糕的,不过(出于各种原因,我甚至不想在这里解释;它们在互联网上的记录已经足够好了)。

您还应该考虑(asyncio是python3,trollius是python2的后端口)。感谢您指向“trollius”,不知道python2中有可用的异步IO后端口。事实上,我在Python3中遇到了asyncio。什么是“asyncoro”?你的问题应该有更多的链接。谢谢Jean Paul。GIL有效地避免使用多个核/处理器,而只使用一个核,而操作系统使用单处理器执行抢占式多任务,这是次优的(与可能使用的所有其他核相比)。Python线程确实映射到基于堆栈的OS线程,因此接近于进程级上下文切换的成本/效率。这是一个正确的理解吗?另外,关于这3个是备选方案的一个问题是,除了Twisted之外,其他2个似乎不支持(尽管没有强有力的证据表明被禁止)串行i/o(pyserial或任何备选方案)。我仍然不确定的是,gevent、asyncoro或trollius中是否有任何东西阻止我在同一个应用程序中使用pyserial。我将阅读/研究更多关于Python线程的内容,以及为什么这是一个如此糟糕的想法,但我得到了警告。