问题标签 [greenlets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - fsm 与 gevent 及其自己的(无限)调用堆栈
我想知道如何定义一个有限状态机,它在 python 中使用 greenlet 循环而不会导致 stckoverflow。
来自https://greenlet.readthedocs.org/en/latest/:
“一个‘greenlet’是一个小的独立伪线程。把它想象成一小堆帧;最外面(底部)的帧是你调用的初始函数,最里面的帧是greenlet当前暂停的那个. 你通过创建许多这样的堆栈并在它们之间跳转执行来使用greenlet。跳转绝不是隐含的:一个greenlet 必须选择跳转到另一个greenlet,这将导致前者暂停,而后者从暂停的地方恢复。在greenlets之间跳跃被称为“切换”。”
我知道我需要更改状态,并且我可以拥有如图所示的 FSM:
在这种情况下,如何确保不会发生堆栈溢出?由于 greenlet 只给了我“一小堆框架”,我对使用它持怀疑态度。
这里是否需要遵循 fsm 设计范式来帮助回到早期的堆栈框架?
TIA
flask - 从 greenlet 中访问烧瓶应用程序上下文
我有一个烧瓶脚本命令,它产生一长串绿色小菜。问题是,这些 greenlets 无法访问我的应用程序上下文。我总是得到一个“> failed with RuntimeError”(访问 app.logger,例如)。建议?
在我的尝试中:spawn(method, app, arg1, arg2)
python - 不加入我的任何一个 Greenlets 可以吗?
我们gevent
在一个长期存在的 Python 进程中使用,随着时间的推移,我们产生了成千上万的 Greenlet。
我们不会加入任何这些 Greenlets;我们只是产生并忘记。(Greenlet 任务本身是短暂的并且会退出。)可以吗? 我们是否因为不加入 Greenlets 而泄露了任何资源?
python - Greenlet version is too old error even the 0.4.5 is installed. Why?
I get this error, Your version of greenlet (0.3.1) is too old (required >= 0.3.2) when I am trying to run ssbench openstack-swift benchmarking tool.
I updated the greenlet to the version 0.4.5 using sudo pip install --upgrade greenlet
but it still give this error. I can see the greenlet.so in the distribution folder which is the latest.
Furthermore, I wrote below to check version,
This also returned 0.3.1.
I am confused why this happens?
python - 为什么我们需要 gevent.queue?
我对 Gevent 的理解是它只是并发而不是并行。我对 Gevent 和 AsyncIO 等并发机制的理解是,Python 应用程序中的任何内容都不会同时执行。
最接近的是,调用非阻塞 IO 方法,并在等待该调用返回 Python 应用程序中的其他方法时能够执行。同样,Python 应用程序中的任何方法都不会同时实际执行 Python 代码。
话虽如此,为什么需要 gevent.queue?在我看来,Python 应用程序实际上并不需要担心一次访问队列实例的 Python 方法不止一个。
我确定有一种情况我没有看到 gevent.queue 修复,我只是好奇那是什么。
python - 线程安全通常意味着 Python 中的 greenlet 安全吗?
我想到的情况是使用可以回调python的python扩展模块,因此当greenlet产生时可能会混合使用python和非python堆栈帧。
我假设如果一个模块使用线程本地存储,它很可能与 greenlets 行为不端。
线程安全模块可能不是greenlet安全的还有其他原因吗?
编辑:我真正想知道的是,greenlets 和常规线程的上下文切换方式是否有区别。greenlets 是否采用任何可能适用于 python 但会破坏某些扩展模块的捷径?
python - monkey_patch(time=True) 如何影响 eventlet.spawn?
通常,在使用greenthread时,我可以将代码编写为:
但使用后money_patch(time=true)
,我可以将代码更改为:
为什么我eventlet.sleep(0)
这次不需要打电话?
在我编写了自己的睡眠函数之后:
并将内置时间模块的睡眠属性设置为my_sleep
func,然后我发现my_sleep
func会被调用很多次,输出很多。但是我在eclipse中只能看到一个调试线程,它没有调用my_sleep
func。
所以,结论是,sleep函数默认是连续调用的,我想eventlet的作者知道这一点,所以他们开发了这个monkey_patch()
函数。那是对的吗?
根据@temoto 的回答,CPython 无法重现相同的结果。我想我应该添加一些信息来介绍我是如何发现这个有趣的东西的。(为什么我第一次没有添加这个信息,因为输入这么多单词并不容易,而且我的英语不是那么好。^^)
当我使用 eclipse 远程调试 openstack 代码时,我发现了这个东西。
在 nova/network/model.py 中,一个函数是这样写的:
当我第一次调试这个函数时,执行后
self._gt = eventlet.spawn(async_method, *args, **kwargs)
回调函数async_method
立即执行。但请记住,这是一个线程,它应该由eventlet.sleep(0)
.
但是我没有找到要调用的代码sleep(0)
,所以如果sleep
可能被eclipse调用,那么在现实世界(非调试世界)中,是谁触发了它?
python - 在 gevent(Greenlets) 中使用“while true”,程序会逐渐停止
我想使用greenlets作为线程:
但它会逐渐停止。是什么原因?
谢谢
python - gevent 有基本的 http 处理程序吗?
我正在尝试使用 gevent.server 构建一个基本的 Web 服务器,并且很想知道是否有任何我可以使用的 baseHTTPHandlers。