0

我在概念化greenlets有什么大不了时遇到了一些麻烦。我了解在同一进程中切换运行功能的能力如何打开通往无限可能的大门;但我没有遇到任何关于他们如何解决标准python技术无法解决的问题的例子(除了生成器中的嵌套函数问题——老实说......“meh”)。

以greenlet 的主页为例,它基本上是一种更复杂的方法:

def test0():
    print 12
    print 56
    print 34

我知道这只是一个多余的例子,但这似乎是greenlets可以做的长期和短期。除非你是一个控制狂,以至于必须决定何时、何地以及如何执行应用程序中的每一行代码,否则如何test0通过使用 greenlets 来改进?或者以GUI 为例(这首先是我对 greenlets 感兴趣的地方);while考虑一个不需要循环的策略应该不难process_commands,不是吗?

我已经看到一些很酷的事情可以用 greenlets 来完成。但只能与其他包(例如,Stackless、gevent 等)中实现的其他一些黑暗巫术结合使用。即使有了这些,greenlets 还是不够的,需要它们进行子类化。

我的问题:

有哪些真实世界的例子可以说明如何单独使用 greenlets 来增强 python 的功能?我怀疑答案在于网络——这可能就是我不明白的原因。但是还有其他人吗?

4

2 回答 2

0

请注意,您的示例已将所有prints 明确地编织到一个函数中。在一个真正的程序中,你不仅有两个功能;您有一些任意数量的函数,其中一些甚至来自您无法控制的第三方库,并且重写所有代码以交错所有语句并不是那么简单。

GUI 实际上是一个很好的例子:通过让事件循环(这是您在实践中处理命令方式,顺便说一句)在没有要读取的事件时暂停自身,您的 GUI 可以在同一个线程上保持交互。如果事件循环必须真正停止并等待用户按下某个键,那么您的 GUI 将冻结,因为没有任何东西会告诉操作系统重绘窗口。

并不是说我特别喜欢 gevent。我将赌注押在 stdlib asyncio 库上。:) 但这实际上是相同的想法:当您有一些工作要做而需要大量等待时,让其他代码同时运行。

于 2014-06-28T01:52:33.453 回答
0

本质上是任何你不想在等待某些东西“回到你身边”时阻塞应用程序的问题(例如sleepsocket)。或者换句话说,事件驱动开发会使事情变得更容易的任何问题。

  • 你提到的网络。
  • 图形用户界面。
  • 模拟/游戏,您可能有 1000 多个演员,并且您希望他们在某种程度上独立行动。
  • 与异步库/框架同步粘合。
于 2022-01-28T14:52:03.737 回答