- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Gevent 池中执行几十个 HTTP 请求。
目标是在请求失败时重试一次,但仅重试一次。否则,它应该抛出异常。
我如何使用 at pool 编写 gevent 代码以支持在失败时重新运行一次 HTTP 请求?
这种方法行得通吗?
import requests
import gevent
from gevent.pool import Pool
pool = Pool(10)
def do_request(id):
r = requests.get('http://example.com/%u' % id)
if not r.status_code == 200:
raise RuntimeError(id)
def spawn_greenlet(id, is_retry=False):
if not is_retry:
g = gevent.spawn(id)
g.link_exception(retry_once)
else:
g = pool.spawn(id)
g.link_exception(raise_exception)
return g
def retry_once(greenlet):
return spawn_greenlet(greenlet.exception.args[0])
def raise_exception(greenlet):
if greenlet.exception:
raise greenlet.exception
raise RuntimeError('Unknown error in greenlet processing.')
greenlets = pool.map(spawn_greenlet, [1, 2, 3, 4, 5])
gevent.joinall(greenlets)
joinall(greenlets)
方法在 do_request
内部发生异常之后但在调用 retry_once
事件处理程序之前返回?spawn_greenlet
处的 is_retry
kwarg?gevent.joinall(greenlets)
仅加入 map 返回的 greenlet。出现异常时,是否将原来的greenlet替换为retry_once
返回的新greenlet?如果不是,即使额外的 greenlet 仍在运行,处理是否继续?在这种情况下,我如何才能等待所有 greenlet 完成?Gevent 文档非常稀缺,网络上似乎没有其他资源对此进行记录,尽管这是一个相当常见的用例。因此,我不认为这是一个过于本地化的问题。
最佳答案
不要使用 spawn/link/link_exception 来重试。只需使用普通的 Python:
def do_something_with_retry(*args):
try:
return do_something(*args)
except Exception:
return do_something(*args)
此外,gevent.pool.Pool.map 会自动在给定的池中生成 greenlet,您不必这样做。
pool = Pool(10)
pool.map(do_something_with_retry, [1, 2, 3])
现在,你只需要实现do_something()
,可以是普通的Python/requests代码:
def do_something(*args):
return requests.get('http://gevent.org')
玩得开心!
关于python - Gevent:重试一次greenlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13992785/
我正在运行一个可以在这里找到的模块:https://github.com/danieliu/play-scraper 我在python文件中的代码如下: 导入 play_scraper print(p
这是什么意思?我该如何解决? gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/home/j
可以requests库 session 对象可以在 gevented 程序中安全地跨 greenlets 使用吗? 编辑 - 添加更多说明: 当一个 greenlet 因调用套接字向服务器发送请求而屈
我使用的是 Windows 10,我从源代码安装 Odoo ( https://github.com/odoo/odoo/tree/aa0554d224337e1d966479a351a3ed059d
greenlet包被 gevent 和 eventlet 用于异步 IO。它是作为 C 扩展编写的,因此不适用于 Jython 或 IronPython。如果不关心性能,那么在纯 Python 中实现
我正在寻找一种通过另一个函数传递函数参数的方法,其方式与 Stackless 的 tasklet 实例化相同: stackless.tasklet(function_being_called)(*ar
我知道阻塞代码对于事件循环(即 NodeJS)来说是一种罪过,但是对于 greenlets(我认为是绿色线程)呢?运行调用阻塞函数的代码是否有问题? 最佳答案 没有 gevent 提供的事件循环的 G
我将 bottle & gevent 用于我的 python (2.7.6) 应用程序。 # -*- coding: utf-8 -*- from __future__ import unicode_
假设我有一个 Event() 进来,并且有 X 个 greenlets 在等待这个事件。当那些等待的 greenlets 完成后,我想做一个 Publish() 我怎么知道什么时候发布? 原理图: e
我对 greenlets 和 gevent 还是个新手,但据我了解,greenlets 会在显式 yield 语句或阻塞 I/O 操作时屈服于其他 greenlets。但是使用 print 语句阻塞写
我正在尝试实现一个简单的 gevent 设置。有一个发件人应该并行向多个服务员发送一个值。 Event 类最接近解决此问题,如下所示。 每三秒,setter 创建一个事件,解除对所有等待者的阻塞。事件
我希望为 gevent greenlet 分配自定义名称/标识符。 Gevent 已经分配了一个唯一的名称: def name(self): """ The greenlet name
我想编写一个程序,其中有几个永远运行的相互调度的函数。我想到使用 gevent 来达到这个目的。他们对长期运行的 greenlet 有什么问题吗? 我正在编写这种格式的程序 from gevent.p
我正在 try catch greenlet 中引发的异常。根据this tutorial ,不幸的是“在 Greenlet 中引发异常,留在 Greenlet 中”。在下面的代码中,我有一个生成爬行
在使用 gevent 时,每当子 greenlet 抛出异常时,我希望它冒泡到父级(理想情况下让父级抛出异常)。在 greenlets 的文档中,它说这是自动完成的,但在 gevent 中似乎并非如此
我正在搜索如何在一个程序中的 gevent 和其他 greenlet 中运行服务器。所以我想要服务器(多个连接)和一个或两个其他 greenlets。这可能吗?如果是,那么如何? 最好的问候,马特。
我正在使用 gevent 下载一些 html 页面。有些网站速度太慢,有些网站会在一段时间后停止服务请求。这就是为什么我必须限制我提出的一组请求的总时间。为此,我使用 gevent“Timeout”。
当我尝试使用 kill() 杀死一个 greenlet 时,'block' 参数默认为 True, Greenlet.kill(self, exception, block, timeout) 文档说
当我使用标准的 logging 包从 greenlets 中打印出日志语句时,我得到的文本如下所示: 2014-02-06 22:38:43,428 [INFO] (11396-Dummy-2) ev
我是异步编程新手。我正在做一个小型 POC,我想了解 greenlets 与共享对象的行为方式。我写了这段代码 - from gevent import monkey, sleep from geve
我是一名优秀的程序员,十分优秀!