问题标签 [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 - 如何将参数作为附加参数传递给 python greenlet
我正在寻找一种通过另一个函数传递函数参数的方法,其方式与 Stackless 的tasklet
实例化相同:
到目前为止,我想出的最好方法是:
这有效,但与 Stackless 的语法不同。我不确定在哪里查看文档以了解如何完成此操作(因此这个问题的标题相当模糊)。这是否可能,或者它是 Stackless 对解释器的更改的一部分?
编辑:我现在知道有一种方法适用于函数,但我不确定它是否适用于我的情况。我正在使用greenlet库:greenlet线程在编辑greenlet时获取args switch()
,而不是在实例化时。如下所示调用它们会导致
TypeError: 'greenlet.greenlet' object is not callable
.
使用greenlet.greenlet(function(args))
(仍然不是正确的语法)会立即执行,并且仍然需要switch()
方法中的 args。因此,我目前使用上面显示的语法将变量存储在类中,以便在调用switch()
. 希望这不会改变太多的问题!
根据要求,这是有问题的代码。首先,eri 的答案的一个变体(免责声明:我以前从未使用过装饰器):
原始代码(工作但在语法上不理想):
python - 记录或打印方法可以切换greenlets吗?
我对 greenlets 和 gevent 还是陌生的,但据我了解,greenlets 在显式 yield 语句或阻塞 I/O 操作上屈服于其他 greenlets。但是使用 print 语句写入标准输出会阻塞吗?那么使用 logging 模块写入 stdout、stderr 或本地磁盘或 NFS 上的文件呢?
对打印语句或日志记录方法的调用会导致 greenlet 切换吗?
python - 使用带有请求的 gevent/greenlets 时出现 ServerNotFoundError
我正在尝试并行化从远程 API 检索数据。远程 API 没有任何批量功能,因此对于我需要的每个对象,我必须发出单独的 GET 请求。
我已将 gevent 添加到组合中。有时效果很好,但如果我再次尝试相同的请求集,100 个请求中的 50 个将失败:
有关解决此问题的方法的任何想法?这是因为太多请求太快的结果吗?如果是这样,有没有一种简单的方法来限制绿叶的数量?
python - 使用 twisted 和 greenlets 时出错
我正在尝试将twisted 与greenlets 一起使用,因此我可以在不使用inlineCallbacks 的情况下以twisted 编写同步外观的代码。
这是我的代码:
有5个主要部分:
- 一个睡眠功能,它启动一个计时器,然后切换回父 greenlet。当计时器关闭时,它会切换回正在休眠的greenlet。
- 一个 make_async 装饰器。这需要一些同步的代码并在 greenlet 中运行。IT 还返回一个 deferred,以便调用者可以在代码完成时注册回调。
- 一个 wait_one 函数,它阻塞 greenlet,直到被等待的延迟解决。
- 内部函数(当被包装时)返回一个延迟的,随机休眠一段时间,然后将它休眠的时间传递给延迟。
- 调用 inner() 的外部函数等待它返回,然后打印返回值。
当我运行这段代码时,我得到了这个输出(注意最后两行的错误):
做了一些研究,我发现:
- 最后一行由 greenlet.c 记录
- 上一行由 python 本身记录,因为它忽略了del方法中引发的异常。
我在调试它时遇到了真正的麻烦,因为我无法访问GreenletExit
ortwisted.python.failure.Failure
异常来获取它们的堆栈跟踪。
有谁知道我做错了什么,或者我如何调试抛出的异常?
另一个数据点:如果我破解 wait_one() 以立即返回(而不是在传递的延迟上注册任何内容),错误就会消失。:-/
python - Can python abstract base classes inherit from C extensions?
It seems as if that when I have an abstract base class that inherits from gevent.Greenlet (which inherits from the C extension module greenlet: https://github.com/python-greenlet/greenlet) then classes that implement it do not raise any of the abc errors about unimplemented methods.
If I inherit from object
it fails as expected:
What is the right way to implement this functionality?
python - Python:从 Gevent Greenlet 中获取价值
我正在学习 Gevent,但无法获取 greenlet 中调用的函数返回的值。以下代码:
给我错误:
我做错了什么,我如何从每个greenlet中获得价值?
python - Python 中的同步 - Gevent 多线程环境
我是一名 java 开发人员并开始学习 python 语言,最近我遇到了使用异步 greenlets 的 Python Gevent 库。有人可以解释一下,同步、死锁、活锁如何在 Python 中使用 Gevent 工作/避免。
- 在 Java 线程中,我们有同步块,它可以防止上述问题
javascript - 尝试停止或关闭时 ZeroRPC python 服务器异常
我有比这更多的代码,所以我将它精简到似乎相关的内容。根据记录的示例,我有一个供 ZeroRPC 使用的 python 类:
python 脚本作为 ChildProcess 从我的 Node.js 服务器生成,该服务器侦听 stdout 和 stderr。当客户端连接超时或服务器关闭时,我在 ChildProcess 上调用 kill() ,该 ChildProcess 将 SIGTERM 发送给它。
仅使用上面的代码,“zpc 停止”永远不会在 Node.js 回调中被捕获,这向我表明 ZeroRPC 服务器在其运行循环的某个地方被杀死。此外,套接字文件仍然存在,表明服务器也没有关闭套接字。所以我想我会在捕获 SIGTERM 后在服务器上调用 stop() 或 close() :
Node.js 通过其 stderr 回调获取异常:
将 stop() 更改为 close() 会导致相同的最终异常集。在 Javascript (Node.js) 中实现相同的想法,close() 清理正在运行的服务器(及其目录中的套接字文件)而不抛出任何异常或警告。
这一切都给我留下了一个问题:如果不是通过 stop() 或 close(),如何在 Python 中干净地停止 ZeroRPC 服务器?
python - Python客户端调用中的双向ZeroRPC导致AssertionError
我的设置产生了一个 Node.js 子节点,它使用 Python 对象创建了一个 2 向 ZeroRPC 会话对。
python端类似这样:
Node.js 子客户端可以调用 Python 服务器上的方法,但该服务器中的客户端无法在 Node.js 子服务器上调用而不出现异常:
Python 类中的客户端是否需要作为 gevent 生成,然后receiveMessage
在需要时调用其方法?还是我忽略了其他一些技巧?
python - '杀死'greenlet块有什么区别
当我试图使用 kill() 杀死一个 greenlet 时,“block”参数默认为 True,
医生说:
如果 block 是True(默认值),请等到 greenlet 死亡或可选超时到期。如果 block 是False,当前的 greenlet 不是计划外的。
如何正确理解这一点?谢谢