问题标签 [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.

0 投票
5 回答
1416 浏览

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 的答案的一个变体(免责声明:我以前从未使用过装饰器):

原始代码(工作但在语法上不理想):

0 投票
1 回答
938 浏览

python - 记录或打印方法可以切换greenlets吗?

我对 greenlets 和 gevent 还是陌生的,但据我了解,greenlets 在显式 yield 语句或阻塞 I/O 操作上屈服于其他 greenlets。但是使用 print 语句写入标准输出会阻塞吗?那么使用 logging 模块写入 stdout、stderr 或本地磁盘或 NFS 上的文件呢?

对打印语句或日志记录方法的调用会导致 greenlet 切换吗?

0 投票
1 回答
302 浏览

python - 使用带有请求的 gevent/greenlets 时出现 ServerNotFoundError

我正在尝试并行化从远程 API 检索数据。远程 API 没有任何批量功能,因此对于我需要的每个对象,我必须发出单独的 GET 请求。

我已将 gevent 添加到组合中。有时效果很好,但如果我再次尝试相同的请求集,100 个请求中的 50 个将失败:

有关解决此问题的方法的任何想法?这是因为太多请求太快的结果吗?如果是这样,有没有一种简单的方法来限制绿叶的数量?

0 投票
2 回答
280 浏览

python - 使用 twisted 和 greenlets 时出错

我正在尝试将twisted 与greenlets 一起使用,因此我可以在不使用inlineCallbacks 的情况下以twisted 编写同步外观的代码。

这是我的代码:

有5个主要部分:

  • 一个睡眠功能,它启动一个计时器,然后切换回父 greenlet。当计时器关闭时,它会切换回正在休眠的greenlet。
  • 一个 make_async 装饰器。这需要一些同步的代码并在 greenlet 中运行。IT 还返回一个 deferred,以便调用者可以在代码完成时注册回调。
  • 一个 wait_one 函数,它阻塞 greenlet,直到被等待的延迟解决。
  • 内部函数(当被包装时)返回一个延迟的,随机休眠一段时间,然后将它休眠的时间传递给延迟。
  • 调用 inner() 的外部函数等待它返回,然后打印返回值。

当我运行这段代码时,我得到了这个输出(注意最后两行的错误):

做了一些研究,我发现:

  • 最后一行由 greenlet.c 记录
  • 上一行由 python 本身记录,因为它忽略了del方法中引发的异常。

我在调试它时遇到了真正的麻烦,因为我无法访问GreenletExitortwisted.python.failure.Failure异常来获取它们的堆栈跟踪。

有谁知道我做错了什么,或者我如何调试抛出的异常?

另一个数据点:如果我破解 wait_one() 以立即返回(而不是在传递的延迟上注册任何内容),错误就会消失。:-/

0 投票
1 回答
980 浏览

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?

0 投票
1 回答
10862 浏览

python - Python:从 Gevent Greenlet 中获取价值

我正在学习 Gevent,但无法获取 greenlet 中调用的函数返回的值。以下代码:

给我错误:

我做错了什么,我如何从每个greenlet中获得价值?

0 投票
1 回答
1016 浏览

python - Python 中的同步 - Gevent 多线程环境

我是一名 java 开发人员并开始学习 python 语言,最近我遇到了使用异步 greenlets 的 Python Gevent 库。有人可以解释一下,同步、死锁、活锁如何在 Python 中使用 Gevent 工作/避免。

  • 在 Java 线程中,我们有同步块,它可以防止上述问题
0 投票
1 回答
1690 浏览

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 服务器?

0 投票
1 回答
1641 浏览

python - Python客户端调用中的双向ZeroRPC导致AssertionError

我的设置产生了一个 Node.js 子节点,它使用 Python 对象创建了一个 2 向 ZeroRPC 会话对。

python端类似这样:

Node.js 子客户端可以调用 Python 服务器上的方法,但该服务器中的客户端无法在 Node.js 子服务器上调用而不出现异常:

Python 类中的客户端是否需要作为 gevent 生成,然后receiveMessage在需要时调用其方法?还是我忽略了其他一些技巧?

0 投票
1 回答
564 浏览

python - '杀死'greenlet块有什么区别

当我试图使用 kill() 杀死一个 greenlet 时,“block”参数默认为 True,

医生说:

如果 block 是True(默认值),请等到 greenlet 死亡或可选超时到期。如果 block 是False,当前的 greenlet 不是计划外的。

如何正确理解这一点?谢谢