问题标签 [gevent]

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 投票
4 回答
5562 浏览

python - 监控作业中的 gevent 异常

我正在使用 gevent 构建一个应用程序。我的应用程序现在变得相当大,因为有很多工作正在产生和销毁。现在我注意到,当其中一项作业崩溃时,我的整个应用程序只会继续运行(如果异常来自非主greenlet),这很好。但问题是我必须查看我的控制台才能看到错误。所以我的应用程序的某些部分可能会“死掉”,而我并没有立即意识到这一点并且应用程序继续运行。

用 try catch 来抖动我的应用程序似乎不是一个干净的解决方案。也许是一个自定义生成函数,它会报告一些错误?

监控 gevent 工作/greenlets 的正确方法是什么?捕捉异常?

在我的情况下,我监听几个不同来源的事件,我应该处理每个不同的事件。有5个工作非常重要。webserver greenlet、websocket greenlet、数据库 greenlet、警报 greenlet 和 zmq greenlet。如果其中任何一个“死”,我的应用程序应该完全死掉。其他死掉的工作并不那么重要。例如,websocket greenlet 有可能由于引发了一些异常而死掉,而其余的应用程序仍然运行良好,就像什么都没发生一样。它现在完全没用而且很危险,应该会严重崩溃。

0 投票
4 回答
2205 浏览

python - 如何在 Gevent 中实现多生产者、多消费者范式?

我有一些依赖 I/O 重阻塞调用的生产者函数和一些也依赖 I/O 重阻塞调用的消费者函数。为了加快速度,我使用了 Gevent 微线程库作为粘合剂。

这是我的范例:

我有四个消费者,希望有两个生产者。生产者在发出信号时退出,即 10。消费者继续从这个队列中获取食物,当生产者和消费者结束时,整个任务完成。

但是,这不起作用。如果我注释掉for产生多个生产者的循环并仅使用一个生产者,则脚本运行良好。

我似乎无法弄清楚我做错了什么。

有任何想法吗?

谢谢

0 投票
3 回答
7402 浏览

python - 使用协程与线程时的吞吐量差异

几天前,我问了一个关于 SO 的问题,关于帮助我设计一个用于构建多个 HTTP 请求的范例

这是场景。我想要一个多生产者、多消费者的系统。我的生产者抓取并抓取了一些网站,并将找到的链接添加到队列中。由于我将爬取多个站点,因此我希望有多个生产者/爬虫。

消费者/工作人员从这个队列中获取信息,向这些链接发出 TCP/UDP 请求,并将结果保存到我的 Django DB 中。我还希望有多个工作人员,因为每个队列项目彼此完全独立。

人们建议为此使用协程库,即 Gevent 或 Eventlet。从未使用过协程,我读到尽管编程范式类似于线程范式,但只有一个线程正在积极执行,但是当阻塞调用发生时 - 例如 I/O 调用 - 堆栈在内存中切换,另一个绿色线程接管,直到遇到某种阻塞 I/O 调用。希望我做对了吗?这是我的一篇 SO 帖子中的代码:

这很有效,因为sleep调用是阻塞调用,当sleep事件发生时,另一个绿色线程接管。这比顺序执行快得多。如您所见,我的程序中没有任何代码故意将一个线程的执行交给另一个线程。我看不出这如何适合上面的场景,因为我希望所有线程同时执行。

一切正常,但我觉得我使用 Gevent/Eventlets 实现的吞吐量高于原始的顺序运行程序,但远低于使用真实线程可以实现的吞吐量。

如果我要使用线程机制重新实现我的程序,我的每个生产者和消费者都可以同时工作,而无需像协程那样交换堆栈。

是否应该使用线程重新实现?我的设计错了吗?我没有看到使用协程的真正好处。

也许我的概念有点混乱,但这就是我所吸收的。对我的范式和概念的任何帮助或澄清都会很棒。

谢谢

0 投票
4 回答
3107 浏览

python - 如何在gevent中捕获回溯

我生成了一个 Greenlet 并将其链接到一个可调用对象。一段时间后,Greenlet 因异常而失败。链接的可调用对象被调用。这一切都很棒!

这是问题:

如您所料,异常的回溯出现在我的控制台上。但我想在链接的可调用文件中使用该回溯来做事。如何在链接的可调用文件中访问该回溯?

(我的第一个直觉是使用traceback.extract_stack(),但事实证明它为链接的可调用对象本身提供了回溯,而不是为异常提供了回溯。)

0 投票
2 回答
2759 浏览

python - 让 Django 变绿

我有一个 Django 管理命令,它发出数千个 TCP/UDP 请求。我已经使用 Gevent 来加快速度,因为我已经重组了我的代码以作为协程工作。套接字连接不再阻塞,但根据我的阅读,Django 的部分仍然不是绿色的。(绿色,我的意思是使用greenlets。)

你能告诉我 Django 的哪些部分不是绿色的,我能做些什么来让它们变成绿色吗?我认为有一些与数据库相关的部分仍然会阻塞。是否有任何 Django 库/补丁可以帮助我将其变为绿色?

我不太关心请求/响应周期是否为绿色,因此 Gunicorn 会帮助我吗?

谢谢

0 投票
2 回答
1424 浏览

django - Django,Ajax 长轮询,Postgresql:空闲事务

我使用 ajax 长轮询和 Gevent 实现了一个聊天。要阅读,客户端 ajax 更新视图并使用 Gevent.event.wait 等待更新。

问题:Django 在请求开始时打开的 Postgresql 事务(用于获取会话信息)直到请求结束才关闭。而那些空闲的事务会占用大量内存。

在不关闭请求的情况下关闭 Postgresql 事务的最干净的方法是什么?我目前正在手动发送 request_finished 信号,但感觉就像是 hack。

0 投票
2 回答
3970 浏览

django - 与 Django 一起使用的最佳 socket.io 服务器是什么 - gevent 或 torndio2?

我正在使用客户端的backbone.js 和socket.io 以及服务器端的Django 开发WebApp。我想在数据更改时从服务器“推送”(就像在聊天应用程序中一样)。我在 Python 中遇到了两个 socket.io 的实现,其中的 Django 集成看起来很有希望:

gevent 和 tornado 都有很好的性能,所以我对其他异步连接框架不感兴趣。唯一的其他要求是使用 SSL 进行连接 - 没有纯文本传输。

那么在这两种方法之间,哪一种最容易实现?Tornadio2 是否有一个很好的基于订阅的框架,类似于 django-socketio 对 gevent 的处理方式?

我遇到的另一个选项是django-serverpush,它也基于 TornadIO2。与其他 TornadIO2 应用程序相比,它与 Django 更好地集成,但在实现生产之前仍需要一些改进。

0 投票
1 回答
1484 浏览

python - 修补 Python 模块时 Django 中的 Gevent 异常

我已经安装了geventgreenlet库,并且在__init__.py我的 Djano 应用程序的文件中,我在这两行中转储了:

现在我经常在我的 Django 控制台中看到如下错误:

当我删除这两行时,我的应用程序工作得很好。这是我在 Windows 机器上使用的软件包的列表。

Django 和 Gevent 是否存在一些兼容性问题?我在这里做错什么了吗。

仅供参考,我正在使用来自非官方 Python 存储库的预构建 Windows 二进制文件,这是一个开发环境。

0 投票
3 回答
4418 浏览

python - gunicorn 和 websockets

我试图让http://www.gelens.org/code/gevent-websocket/运行并不断收到以下错误。

我在 Mint Linux 上运行 python 2.7.2

0 投票
6 回答
24511 浏览

python - 如何在 Windows 上安装 gevent?

我正在尝试在 Windows 上安装 gevent。为了做到这一点,我下载并编译了 libevent,然后我运行pip install gevent并得到一个错误:Please provide path to libevent source with --libevent DIR. 如何将libevent选项传递给setup.pyusing pip

在此先感谢,伊万。

UPD:运行pip install gevent --install-option="--libevent path_to_libevent"给出相同的结果。