问题标签 [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 - Gevent:使用两个队列和两个消费者,而不会同时相互阻塞
我有一个问题,我需要将消费者生成的值写入磁盘。我不想每次都打开要写入的文件的新实例,所以我想使用第二个队列和另一个消费者从单个 Greenlet 写入磁盘。我的代码的问题是第二个队列没有从第一个队列异步消耗。第一个队列首先完成,然后第二个队列被消耗。我想同时将值写入磁盘,然后生成其他值。感谢帮助!
asynchronous - Python:确定任务的优先级并在没有锁的情况下运行异步任务
现在我正在使用 Gevent,我想问两个问题:
- 有没有办法执行永远不会异步执行的特定任务(而不是在每个任务中使用锁)
- 有没有办法在 Gevent 中对生成的任务进行优先级排序?就像一组将以低优先级生成的任务将在所有其他任务完成时执行。例如,当每个任务处理不同优先级的套接字请求时,两个任务会监听不同的套接字。
如果在 Gevent 中不可能,还有其他库可以做到吗?
编辑
也许芹菜可以在这里帮助我?
python - 如何在 WSGIServer/flask 环境中从 gevent 同步 greenlets
在我设计用于远程管理 RPI 上的某些服务的基于烧瓶的 http 服务器中,我遇到了一个我无法单独解决的问题,因此请您给我一个提示。
概念:通过 flask 和 gevent,我可以停止并运行一些(两个)在 RPI 上运行的服务。我使用 gevent 和关于 javascript 的服务器端事件来收听 html 更新。
html 页面显示服务的状态(开/关/处理),并提供打开/关闭它们的按钮。另外显示一些系统参数(CPU、RAM、HDD、NET)。
只要只有一个用户/页面打开,一切都按预期工作。一旦有更多用户访问烧瓶服务器,就会在为每个用户/页面提供服务的 greenlet 之间进行竞争,并且并非所有页面都会重新加载。
问题:如何向所有正在运行的 greenlets sse_worker() 发送消息并在他们的常规工作之上处理它?
在高级代码下方。完整的源代码可以在这里找到:https ://github.com/petervflocke/flasksse_rpi检查 sse.py 文件
...在 html 页面上,相应地处理流式 json 数据。如果服务的状态已根据 reload_page 变量 javascript 重新加载完整页面 - 代码摘录如下:
我想要的解决方案是像这样扩展 sse_worker() :
我希望我能传递我的信息。您有什么想法可以解决同步问题吗?请注意,我们在同一个 sse_worker 函数中有生产者和消费者。
任何想法都非常受欢迎!最好的问候彼得
greenlets - 正确处理儿童 Greenlets
我通过继承来创建任务Greenlet
。我有一个单亲任务,start()
它在其_run()
. 在其他地方(它恰好是一个 systemd 服务)start()
并被join()
调用。
这种行为似乎是正确的。例如,使用Queue
带有超时的 a 可以达到预期的效果,但我还没有找到一种很好的方法来关闭子进程,KeyboardInterrupt
或者注册一个回调到父任务的SIGTERM
. 在处理程序中,我会调用child1.kill()
“child2.kill() but only the first called seemed to raise
GreenletExit”。
我从不拜访join()
孩子们,我不确定我会如何正确地做到这一点。我在滥用图书馆吗?
python - gevent找到父greenlet
有没有办法知道当前的greenlet是从哪个greenlet生成的?
- 我意识到产生当前 greenlet 的 greenlet 可能已经终止,但在这种情况下,我可以处理 None 作为答案。
- 我知道 gevent.Greenlet.parent 但这仅代表集线器,而不是从其启动当前greenlet的直接greenlet
- 我更喜欢不涉及猴子修补 gevent.Greenlet 的解决方案
我的用例是:我有一个服务器来处理执行 python 代码的请求(是的,是的,我知道这是不安全的 :-)。每个请求都会产生一个处理请求的greenlet,包括将任何输入、输出或错误重定向到请求专用的通道。我希望能够同时处理请求,并且请求可能会自己产生绿叶。
你可以在这里找到我想要做的一个例子
boto3 - boto3是否支持greenlets?
我做了一个快速的谷歌搜索,并没有找到任何明确的陈述。基本上,我正在尝试从 SQS 读取事件并处理它们,而 asio 预计将由 greenlets 处理。
那么可以在greenlet中使用boto3的粒度是多少?我需要每个greenlet的会话/客户端吗?我需要额外的互斥锁吗?
python - 在 Python 进程之间共享嵌套对象,对 tasklet(协程)具有写访问权限?
如何在 Python 进程之间共享嵌套对象,并对 tasklet(协程)进行写访问?
这是一个简化的例子,我只是为了正确地提出这个问题而写的一个类比;
首先请安装greenlet
包:sudo pip install greenlet
在下面的示例中:
- 变量
Nature
引用的类的实例habitat
- 这个
Nature
类的实例有一个名为的实例变量animals
- 在启动这个
Nature
类实例的同时,创建了 8 个不同的Animal
类实例并将其附加到animals
实例变量中。现在,如果我是正确的,这个实例Nature
是一个嵌套对象。 - 作为实例的最后一步
live
实例函数Animal
使用greenlet
包的switch()
函数随机切换,直到global_counter
达到1000。该live
函数随机改变实例的limbs
实例变量的值Animal
。
绿色测试.py:
结果是:
按预期工作。改变limbs
and的值global_counter
(非零)
但是当我加入multiprocessing
等式时;
greentest2.py:
结果并不如预期:
limbs
和的值global_counter
都不变(零)。我认为这是因为Animal
类的实例并global_counter
没有在进程之间共享。那么如何在进程之间共享这个Nature
类的实例或这些类的实例呢?Animal
根据@noxdafox 的回答添加;
greentest3.py:
然后结果是:
我完全知道global_counter
可以与此方法共享,因为它是一个整数,但我实际上是在询问如何在进程之间共享实例Nature
和类。Animal
python - python多处理,gevent,greenlets的最佳分析器是什么?
我正在尝试分析我的脚本,该脚本使用多处理并在多个池中生成 greenlets。我尝试了几个库,这些库是谷歌搜索的结果,但没有什么可观的。
我正在寻找一个分析器,它提供了所有基本结果,没有任何先进。我尝试使用 GreenProfiler、cProfile、gevent_profiler 等。是否有任何 apm 工具(如 new Relic、Dynatrace 等)在支持多进程、greenlets 的 python 中提供代码级统计信息?
python - grequest 不会始终快速发送请求
我在 python 2.7 中编写了一个 TCP 代理服务器,它使用 gevent 为每个连接创建一个 greenlet。当套接字关闭时,我关闭了greenlet。我正在使用grequest.map来发布给定连接接收到的数据。我正在使用 grequests,因为我希望 greenlet 在等待对 POST 的 HTTP 响应时产生。
当我测试仅使用单个连接在本地运行的服务器时,有时从映射 grequest 到 urllib3 记录它正在启动连接需要 0.5 秒。并不一致,大多是在 0.05s 内发出请求,但偶尔会更长。
我正在记录从我告诉 grequests 发出请求所花费的时间以及请求报告的经过时间。此外,我正在为所有日志添加时间戳,因此我可以在日志中看到有时存在很大的时间间隔。
这是代码在服务器上的样子:
这是需要很长时间才能发布时生成的日志的示例:
为什么请求有时需要这么长时间才能出去?当端点的响应速度也很慢(考虑到平均值,0.6 秒很慢)时,似乎会发生这种情况,但我不确定这些是否相关或为什么相关。
python - 为什么运行的greenlets数量高于实际创建的greenlets数量。1 个额外的 greenlet 正在同步运行
首先,理想情况下,以下代码应该同步运行 3 个 greenlets,但它会异步运行所有 3 个 greenlets。然而奇怪的事情是不管你有多少个greenlet,它都会为第二个greenlet启动一个额外的同步过程。我不是问这个问题的解决方法,只是我想了解这背后的原因。
这是示例标准输出:
怎么会func 1 started
发生两次?